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

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

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

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

15
задан Konrad Garus 2 April 2012 в 20:53
поделиться