Чтение "Java Concurrency In Practice", в разделе 3.5 есть эта часть:
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
Помимо очевидной угрозы безопасности потоков при создании двух экземпляров 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
не будет блокироваться, поэтому будет создана ссылка на экземпляр, в то время как код конструктора все еще выполняется в другом потоке.
Это возможно?