В Java есть случай до / после модели памяти. Для запуска этого поведения должна быть какая-то общая параллельная конструкция (например, синхронизированный блок / метод, блокировка, изменчивый, атомарный) как на пути записи, так и на пути чтения.
Если вы синхронизируете оба метода, вы создаете блокировку для всего объекта, которая будет совместно использоваться потоками чтения и записи. JVM гарантирует, что любые изменения, происходящие в потоке записи, которые происходят до выхода из (синхронизированного) метода setInt, будут видимы для любых потоков чтения после того, как они войдут в (синхронизированный) метод getInt. JVM вставит необходимые барьеры памяти, чтобы гарантировать, что это произойдет.
Если синхронизируется только метод записи, то изменения объекта могут быть не видны ни одному потоку чтения. Это связано с тем, что на пути чтения нет точки, которую JVM может использовать, чтобы гарантировать, что видимая память потока чтения (кеш и т. Д.) Соответствует потоку записи. Это обеспечит синхронизация метода getInt.
Примечание. В частности, в этом случае изменение значения поля 'number' в качестве изменчивого даст правильное поведение, поскольку чтение / запись в режиме изменяемого состояния также обеспечивает такое же поведение видимости памяти в JVM, а действие внутри метода setInt является только присваиванием.
person
Michael Barker
schedule
01.09.2010