Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: volatile, happens, before

Как volatile связан с happens-before?

Вопрос проверяет понимание формальной связи между volatile и гарантиями Java Memory Model.

Короткий ответ

Запись в volatile поле формирует отношение happens-before с последующим чтением этого поля.
Это гарантирует видимость всех предыдущих записей.
Таким образом volatile используется как точка синхронизации.
Это одна из самых простых форм happens-before в Java.
Она широко используется в lock-free паттернах.

Длинный ответ

Связь volatile и happens-before — строго формализована в JMM.

Формальное правило

Определение:
Запись в volatile поле happens-before любого последующего чтения этого же поля.

Что это дает

Это правило гарантирует:

  1. Видимость всех записей, выполненных до volatile write.

  2. Запрет опасных переупорядочиваний.

  3. Корректную публикацию состояния.

Пример публикации объекта

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:

  • значение могло бы быть неинициализированным

Ограничения подхода

Важно помнить:

  1. volatile не заменяет блокировки.

  2. Подходит только для простых сценариев.

  3. Не защищает инварианты нескольких полей.

Краткий вывод

volatile напрямую формирует отношение happens-before, обеспечивая гарантии видимости и порядка между потоками.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Java

    Java

Ключевые слова

#volatile

#happens

#before

Подпишись на Java Developer в телеграм