Модель памяти Java - что именно сбрасывается в память при пересечении барьера памяти? - PullRequest
15 голосов
/ 03 апреля 2012

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

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

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

1 Ответ

12 голосов
/ 03 апреля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...