Почему блокировка с двойной проверкой нарушена в Java?

Этот вопрос относится к поведению старых версий Java и старых реализаций алгоритма блокировки с двойной проверкой.

Новые реализации используют volatile и полагаются на слегка измененные volatile семантика, поэтому они не нарушены.


Это ' lock и начинает инициализировать значение.

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

    15
    задан Raedwald 7 January 2019 в 15:35
    поделиться