Я прочитал этот ответ, в конце которого написано следующее:
Все, что вы можете с помощью volatile, может быть выполнено с синхронизацией, но а не наоборот.
Не понятно. JLS 8.3.1.4 определяет изменчивые поля следующим образом:
Поле может быть объявлено изменчивым, и в этом случае модель памяти Java гарантирует, что все потоки будут видеть согласованное значение для переменной (§17.4).
Итак, изменчивые поля - это видимость памяти. Кроме того, насколько я понял из ответа, который я цитировал, чтение и запись в изменчивые поля синхронизированы.
Синхронизация, в свою очередь, гарантирует, что только один поток имеет доступ к синхронизированному блоку. Как я понял, это не имеет ничего общего с видимостью памяти. Что я пропустил?