Я не мог понять ниже фрагмент кода от A fix that doesn't work. (Я прочитал объяснение, которое следует на той же странице).DCL с двумя синхронизированными блоками сломан?
Если у нас есть 2 синхронизированных блока, как эта версия DCL сломана? Или это не применимо после Java5?
// (Still) Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null) {
Helper h;
synchronized(this) {
h = helper;
if (h == null)
synchronized (this) {
h = new Helper();
} // release inner synchronization lock
helper = h;
}
}
return helper;
}
// other functions and members...
}
Внутренний «синхронизированный» блок абсолютно бессмыслен. Нить не делает _not_ приобретает блокировку, когда она входит во внутренний блок, потому что она уже владеет ею, и она не освобождает блокировку, когда она покидает внутренний блок, потому что она должна продолжать владеть им, пока не покинет внешний блок. –