Чтение Java concurrency на практике, раздел 3.5: Требование поднято, что
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
Помимо очевидной опасности, связанной с безопасностью создания 2 экземпляров Holder, в книге утверждается, что может возникнуть возможная проблема публикации, еще больше для класса Holder, такого как
public Holder {
int n;
public Holder(int n) { this.n = n };
public void assertSanity() {
if(n != n)
throw new AssertionError("This statement is false.");
}
}
может быть сброшено AssertionError!
Как это возможно? Единственное, что я могу думать об этом, может позволить такое смехотворное поведение, если конструктор Holder не будет блокировать, поэтому ссылка будет создана для экземпляра, в то время как код конструктора все еще работает в другом потоке. Возможно ли это?