Этот вопрос относится к поведению старых версий Java и старых реализаций алгоритма блокировки с двойной проверкой.
Новые реализации используют volatile
и полагаются на слегка измененные volatile
семантика, поэтому они не нарушены.
Это '
lock и начинает инициализировать
значение.
Из-за семантики некоторых языков программирования код
сгенерированный компилятором допускается
чтобы обновить общую переменную до точки
к частично построенному объекту
до того, как А завершит выполнение
инициализация. Поток B замечает, что общая переменная была инициализирована (или около того
появляется), и возвращает его значение.
Поскольку поток B считает, что значение
уже инициализирован, он не
получить замок. Если B использует объект
перед выполнением всей инициализации
by A виден B (либо потому, что A
не завершил инициализацию или
потому что некоторые из инициализированных значений
в объекте еще не просочились
в память, которую использует B (cache
согласованность)) программа скорее всего будет
авария.
(из http://en.wikipedia.org/wiki/Double-checked_locking ). Когда это возможно? Возможно ли, что на 64-битной JVM операция присвоения не является атомарной?
Если нет, то действительно ли нарушена «блокировка с двойной проверкой»?
задан Raedwald 7 January 2019 в 15:35
поделиться