Поведение синхронизированного

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

Поток A имеет ссылку на объект C и изменяет поле C в своем синхронизированном коде, синхронизированном с C. Поток B также имеет ссылку на объект C. Теперь поток A приостанавливается до завершения синхронизированного кода. Поток B переходит к действию и получает доступ к полю объекта C в коде без синхронизации с C.

Теперь поток B гарантированно увидит изменения, сделанные потоком A?


person chamibuddhika    schedule 17.10.2010    source источник


Ответы (2)


В дополнение к существующему ответу обратите внимание, что «случается до (X, Y)» гарантирует только то, что Y увидит обновления X, а не то, что другие потоки увидят результаты X до результатов Y.

(На самом деле, вам не обязательно находиться внутри блока synchronized, чтобы иметь отношения «происходит до» между последовательными действиями внутри одного потока. См. первый пункт 17.4.5 в JLS.)

person waxwing    schedule 17.10.2010

Дело в том, что поток B также должен использовать синхронизированный блок, синхронизируясь на том же мониторе, что и поток A.

Если поток B не использует синхронизацию, изменения могут быть видны или не видны.

person Jon Skeet    schedule 17.10.2010