Возможно, на этот вопрос уже был дан ответ, но из-за сложности вопроса мне нужно подтверждение. Поэтому я перефразирую вопрос
Вопрос 1. Когда поток входит в синхронизированный блок, барьер памяти будет включать любые затронутые поля, а не только поля объекта, который я синхронизировал? Таким образом, если внутри синхронизированного блока изменяется много объектов, это означает, что много памяти перемещается между кэшами памяти потоков.
Thread 1
object.field1 = "";
synchronized (lock) {
farAwayObject.field1 = "";
farAwayObject.evenFarther.field2 = "";
}
Thread 2. assuming thread ordering is correct
synchronized (lock) {
//thread 2 guaranteed to see all fields above as ""
//even object.field1 ?
}
Вопрос 2. Является ли object.field1 = "";
в потоке 1 неявной частью отношения "происходит до"?
Я надеюсь, что это так, но это может быть не так. Если нет, то есть ли способ сделать это, не помещая его в блок синхронизации? Трудно рассуждать о программе иначе, и нецелесообразно размещать все под синхронизированным { }.
РЕДАКТИРОВАТЬ: уточнение: object.field1 не является изменчивым, и вопрос заключается в том, «будет ли поток 2 гарантированно видеть запись потока 1, по крайней мере». Мой вопрос касается видимости памяти. В качестве аргумента предположим, что только поток 1 записывает в энергонезависимый object.field1.
Вопрос 2 можно перефразировать так:
«Будет ли синхронизированный блок в блокировке выталкивать изменения, сделанные ранее, чтобы их могли увидеть другие потоки, синхронизирующиеся в той же блокировке?»
object.field1
не будет участвовать в событиях-раньше, аThread2
может или не может увидеть обновление? - person CKing   schedule 08.02.2017