Вопрос проверяет понимание формальной связи между volatile и гарантиями Java Memory Model.
Запись в volatile поле формирует отношение happens-before с последующим чтением этого поля.
Это гарантирует видимость всех предыдущих записей.
Таким образом volatile используется как точка синхронизации.
Это одна из самых простых форм happens-before в Java.
Она широко используется в lock-free паттернах.
Связь volatile и happens-before — строго формализована в JMM.
Определение:
Запись в volatile поле happens-before любого последующего чтения этого же поля.
Это правило гарантирует:
Видимость всех записей, выполненных до volatile write.
Запрет опасных переупорядочиваний.
Корректную публикацию состояния.
class Holder {
int value;
}
volatile Holder holder;
// поток 1
Holder h = new Holder();
h.value = 42;
holder = h; // volatile write
// поток 2
Holder h2 = holder; // volatile read
System.out.println(h2.value); // всегда 42
Без volatile:
значение могло бы быть неинициализированным
Важно помнить:
volatile не заменяет блокировки.
Подходит только для простых сценариев.
Не защищает инварианты нескольких полей.
volatile напрямую формирует отношение happens-before, обеспечивая гарантии видимости и порядка между потоками.