Да, изменения, внесенные в синхронизированные , могут (но не гарантированы) быть видимыми до того, как вы достигнете конца синхронизированного блока.По сути, вам обычно нужно синхронизировать (при одной и той же блокировке) при чтении или записи данных, чтобы получить согласованное представление о мире.
Гарантии, предоставляемые для синхронизации, заключаются в том, чтобы "делать правильные вещи »(синхронизировать должным образом) работают правильно - они не гарантируют, что изменения сделаны атомарно, когда вы не делаете правильные вещи (наблюдая за общими переменными без синхронизации).
Вы можете (до некоторой степени) считать записи в синхронизированном блоке аналогичными вызовам OutputStream.write()
, а выход синхронизированного блока - вызовом flush()
.Когда вы проходите половину блока, некоторые данные, которые вы записали , могут попасть в выходной файл (или что-то еще), но они все еще могут быть буферизованы.Это не означает, что реализована модель памяти, это всего лишь аналогия, которая поможет вам понять, как видимость не гарантируется.