Поведение синхронизированного - PullRequest
0 голосов
/ 17 октября 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 17 октября 2010

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

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

0 голосов
/ 17 октября 2010

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

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

...