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

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

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

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

Ответы

Ответ 1

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

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

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