Короткий ответ таков: JSR-133 заходит слишком далеко в своем объяснении . Это не серьезная проблема, потому что JSR-133 является ненормативным документом, который не является частью языка или стандартов JVM. Скорее, это всего лишь документ, который объясняет одну возможную стратегию, которой достаточно для реализации модели памяти, но в общем случае не требуется . Кроме того, комментарий о «очистке кеша» в основном совершенно неуместен, поскольку практически нулевые архитектуры реализуют модель памяти Java, выполняя любой тип «очистки кеша» (а многие архитектуры даже не имеют таких инструкций).
Модель памяти Java формально определена в терминах таких вещей, как видимость, атомарность, отношения «происходит до того» и т. Д., Что объясняет, какие именно потоки должны увидеть, что, какие действия должны происходят перед другими действиями и другими отношениями, используя точно (математически) определенную модель. Поведение, которое не определено формально, может быть случайным или четко определенным на практике на некоторых аппаратных средствах и реализации JVM - но, конечно, вы никогда не должны полагаться на это, так как это может измениться в будущем, и вы никогда не сможете быть уверены, что во-первых, он был четко определен, если только вы не написали JVM и не знали семантику оборудования.
Таким образом, текст, который вы цитировали, формально не описывает то, что гарантирует Java, а скорее описывает, как некоторая гипотетическая архитектура, имеющая очень слабое упорядочение памяти и гарантии видимости может удовлетворить требования модели памяти Java с использованием очистки кеша , Любое реальное обсуждение очистки кеша, основной памяти и т. Д. Явно неприменимо к Java, так как эти понятия не существуют в спецификации абстрактного языка и модели памяти.
На практике гарантии, предлагаемые моделью памяти, гораздо слабее, чем полная очистка - если каждая атомарная, связанная с параллелизмом или блокирующая операция очистка всего кэша будет непомерно дорогой, - это практически никогда не делается на практике. Вместо этого используются специальные атомарные операции с ЦП, иногда в сочетании с инструкциями барьер памяти , которые помогают обеспечить видимость и порядок памяти. Таким образом, очевидное несоответствие между дешевой безудержной синхронизацией и «полной очисткой кеша» устраняется, если заметить, что первая верна, а вторая нет - полная модель сброса не требуется для модели памяти Java (и на практике никакого сброса не происходит).
Если формальная модель памяти слишком тяжела, чтобы ее переварить (вы не были бы одиноки), вы также можете углубиться в эту тему, взглянув на поваренную книгу Дуга Ли , которая находится в факт, связанный с часто задаваемыми вопросами JSR-133, но возникает с конкретной аппаратной точки зрения, поскольку предназначен для разработчиков компиляторов. Там они говорят о том, какие именно барьеры необходимы для конкретных операций, включая синхронизацию, и обсуждаемые там барьеры довольно легко можно сопоставить с реальным оборудованием. Большая часть фактического сопоставления обсуждается прямо в кулинарной книге.