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