Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: volatile, instruction, reordering

Защищает ли volatile от переупорядочивания инструкций?

Вопрос проверяет понимание гарантий volatile в Java Memory Model и его влияния на порядок выполнения инструкций.

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

Да, volatile частично защищает от переупорядочивания инструкций.
Запись в volatile поле запрещает переупорядочивание операций до и после неё.
Чтение из volatile также накладывает ограничения на порядок инструкций.
Однако volatile не делает код атомарным.
Он решает задачи видимости и порядка, но не взаимного исключения.

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

Чтобы корректно понять роль volatile, нужно рассматривать его через призму Java Memory Model (JMM).

Что такое переупорядочивание

Компилятор и процессор могут:

  1. Менять порядок инструкций.

  2. Сохранять логический результат.

  3. Улучшать производительность.

В многопоточности это может привести к:

  • чтению неинициализированных данных

  • некорректному состоянию объектов

Гарантии volatile

Определение:
volatile — это модификатор поля, который гарантирует видимость изменений и частичный порядок операций между потоками.

Он вводит:

  1. Memory barrier при записи.

  2. Memory barrier при чтении.

Что именно запрещается

Для volatile поля:

  1. Запись до volatile write не может быть перемещена после неё.

  2. Чтение после volatile read не может быть перемещено до неё.

Пример:

volatile boolean ready;
int data;

data = 42;
ready = true; // volatile write

Другой поток:

if (ready) {          // volatile read
    System.out.println(data); // гарантированно 42
}

Ограничения volatile

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

  1. volatile не защищает составные операции (i++).

  2. Не заменяет synchronized.

  3. Работает только на уровне одного поля.

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

volatile защищает от опасных переупорядочиваний вокруг чтения и записи поля, но не обеспечивает атомарность и взаимное исключение.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Java

    Java

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

#volatile

#instruction

#reordering

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