2010-10-17 3 views
0

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

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

А теперь нить B обязательно увидит изменения, сделанные Thread A?

ответ

0

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

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

3

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

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

Смежные вопросы