Т.е. я правильно понимаю, что речь будет идти только про коллекционирование различных экивоков?
Да. В стиле таком: на сайте висит баннер «нам не поступало постановление от правительства по слежке за вами», а потом он пропадает. Значит постановление поступило :)
Вангую, что дело в мелатонине, который разрушается от света, в особенности из синей части спектра.
Все экраны к вечеру «зажелтяю» с помощью программы f.lux. А также могу порекомендовать средство «Мелаксен» или просто мелатонин из магазина спортивного питания.
Математика — такая штука, что не снимает. Просто у подавляющего большинства читателей не хватит ни времени, ни желания, ни компетенции разобраться в выкладках (и найти ошибку).
Кроме того — завершение секции synchronize приведёт к записи переменной, т.к. является барьером синхронизации в Java, разве нет?
Я поизучал и поспрашивал на SO. Кратко: volatile тут таки необходим.
Подробно
Возьмем пример
class Foo {
private volatile Bar _barInstance;
public Bar getBar() {
if (_barInstance == null) {
synchronized(this) { // or synchronized(someLock)
if (_barInstance == null) {
Bar newInstance = new Bar();
// possible additional initialization
_barInstance = newInstance;
}
}
}
return _barInstance;
}
}
Компилятор/рантайм могут переставить инструкции, связанные с инициализацией объекта. Ссылка _barInstance может быть присвоена раньше, чем выполнятся инструкции конструктора. Другой поток может увидеть, что _barInstance и, соответственно, не брать lock. А значит happens-before на этом блоке синхронизации не случится и появляется риск использования недоинициализированного объекта.
Все экраны к вечеру «зажелтяю» с помощью программы f.lux. А также могу порекомендовать средство «Мелаксен» или просто мелатонин из магазина спортивного питания.
Макаронный монстр такой фигни не велит! :)
volatile
тут таки необходим.Компилятор/рантайм могут переставить инструкции, связанные с инициализацией объекта. Ссылка
_barInstance
может быть присвоена раньше, чем выполнятся инструкции конструктора. Другой поток может увидеть, что_barInstance
и, соответственно, не брать lock. А значит happens-before на этом блоке синхронизации не случится и появляется риск использования недоинициализированного объекта.lazy val abc = ...
в DCL с битовым флагом.