Модель памяти Java - что именно сбрасывается в память при преодолении барьера памяти?

Я думаю, что понимаю связь «произошло раньше» для отдельных переменных. Если я напишу изменчивое поле, все последующие чтения этого поля будут содержать это новое значение. Запись volatile преодолевает барьер памяти и сбрасывает новое значение в основную память.

Я до сих пор не понимаю, что происходит во всех других случаях - например, Thread.start(), synchronized или новые блокировки в java.util.concurrent. Что означает, что они также преодолевают барьер памяти? Какие данные сбрасываются из локального кеша в основную память? Другими словами, каковы масштабы пересечения?

Всегда ли все сбрасывается? Теперь вернемся к volatile, сбрасывает ли он больше, чем просто одно поле volatile?


person Konrad Garus    schedule 02.04.2012    source источник


Ответы (1)


При преодолении барьера памяти JVM синхронизирует все локально (в контексте текущего потока) кэшированные переменные с основной памятью. Кроме того, он удаляет все локально кэшированные данные, помеченные как грязные в основной памяти.

Что касается энергозависимости - да, он также синхронизирует все локально кешированное с основной памятью, а не только одно энергозависимое поле (с 1.5)

http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml

person Eugene Retunsky    schedule 02.04.2012
comment
Кроме того, вы должны упомянуть, что он удаляет все кешированные хранилища, которые загрязнены в центральной памяти. Извините за придирчивость. Это хороший вопрос. - person Gray; 03.04.2012
comment
@Gray, не могли бы вы подробнее рассказать (или предоставить ссылку) о грязном кешированном хранилище в основной памяти? Что это? - person Konrad Garus; 03.04.2012
comment
@Konrad Eugene отвечает на вопрос. Я просто пытался заставить его упомянуть, что когда преодолевается барьер памяти, синхронизация происходит в обоих направлениях. Или, по крайней мере, если синхронизация из основной памяти в локальный кеш не происходит, по крайней мере, все локальные кеши, которые загрязнены в основной памяти, становятся недействительными. - person Gray; 03.04.2012
comment
AFAIK, он гарантирует, что грязные данные находятся в согласованном состоянии кеша. Это не обязательно должно идти полностью в основную память. На x86 / x64 он также останавливает конвейер процессора, что может повлиять на производительность. - person Peter Lawrey; 03.04.2012