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