Модель Java Memory Model может ответить на ваш вопрос: в модели памяти Java энергозависимое поле имеет барьер хранилища, вставленный после записи в него, и барьер загрузки, вставленный перед чтением его.Квалифицированным конечным полям класса вставляется барьер хранилища после их инициализации, чтобы гарантировать, что эти поля будут видимы после завершения конструктора, когда доступна ссылка на объект.
см. https://dzone.com/articles/memory-barriersfences
Другими словами: когда поток пытается прочитать из volatile var, JMM заставляет все процессоры, владеющие этой областью памяти, выполнять обратную запись в память из кэша локального процессора.Затем CPU загружает свое значение в локальный кеш при необходимости.
И та часть, которая мне не ясна, такова.Нужно ли мне использовать volatile, чтобы убедиться, что изменения, сделанные в предыдущем потоке, видимы для следующего выполнения потока.
Да и нет.Ключевое слово Volatile просто для того, чтобы сделать значение переменной видимым для других потоков.Но если вам нужен только один поток чтения-записи в данный момент = вам нужна синхронизация.Если вам нужно предоставить только видимость = достаточно ключевого слова volatile.
Если вы не используете ключевое слово volatile и разделяете значение в потоках, оно может быть устаревшим или даже поврежденным.Для типа LONG Java делает 2 записи по 32 бита, и они не являются атомарными.Допустим, другой поток может прочитать значение между этими двумя записями.