Этот вопрос конкретно о JVM и гарантиях видимости памяти
Предположим, что у меня есть поток t1
, который обращается к переменной в куче, скажем x
Предположим, что поток запланирован для выполнения в ядре c1
и изменил x
в регистрах (после выборки из ОЗУ) & x
должен быть перемещен из регистров, потому что t1
необходимо выполнить еще немного инструкции, требующие загрузки дополнительных данных в регистры. Таким образом, x
находится в кэше c1
вместо регистров
Теперь ОС планирует другой поток t2
в c1
, поэтому регистры процессора заполнены новыми данными, но у нас все еще есть емкость в кеше для x
(фактически, я имею в виду, что кэш может не были сброшены в RAM / L3. Это мое предположение, я не уверен, так ли это на самом деле)
Через некоторое время ОС запланирует исходный поток t1
на новом ядре c2
. Требуется ли по-прежнему t1
видеть последнее значение x
в кэше c1
при любых обстоятельствах?
Если t1
в c2
не видит последние x
в c1
, я считаю, что мы будем нарушать Последовательную согласованность JMM
Я не прав?
PS: я уже читал эту другую ветку, в которой говорится об одной и той же / подобной проблеме, но она не адресовала вопрос к моему удовлетворению. Так что перепост это здесь
Видимость данных на многоядерном процессоре по одному потоку