Этого, возможно, ответили раньше, но из-за сложности проблемы мне нужно подтверждение. Так что я перефразирую вопросЭффекты синхронизации синхронизируемого ключевого слова в Java
Вопрос 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 неявно часть происходит, прежде, чем отношения?
Надеюсь, но это может быть и не так. Если нет, есть трюк, чтобы сделать это, не помещая его в блок синхронизации? Трудно рассуждать о программе иначе и нецелесообразно ставить все под синхронизированный {}.
EDIT: уточнение: object.field1 не является изменчивым, и вопрос заключается в том, что «будет ли нить 2 гарантированно видеть запись нитки 1, по крайней мере». Мой вопрос о видимости памяти. Для аргумента предположим, что только поток 1 записывается в нестабильный object.field1.
Вопрос 2 можно перефразировать, как
«Будет ли синхронизированный блок на замок нажимных изменения, сделанные до того, чтобы быть замеченными другими потоками синхронизации на том же замке?»
Ответ на оба вопроса. – shmosel
@shmosel У меня было понимание, что 'object.field1' не будет частью события-before и' Thread2' может или не может увидеть обновление? – CKing