Описание тега java-memory-model
Выполнение однопоточной программы интуитивно понятно, поскольку оно следует порядку выполнения программы (т. Е. Порядку, в котором операторы размещены в исходном коде).
Однако, когда программа использует несколько потоков и эти потоки совместно используют информацию, порядок выполнения может стать неинтуитивным из-за переупорядочения инструкций, частично построенных объектов, одной и той же переменной, имеющей разные значения в разных потоках из-за кэширования на уровне ЦП и т. Д.
Модель памяти Java (JMM) описывает, какие исполнения программы допустимы, путем определения того, какое значение (значения) можно наблюдать при чтении общей переменной в соответствии с определенными правилами, которые определены в главе 17 Спецификации языка Java (JLS)., более конкретно в разделе 17.4.