Что делает ключевое слово volatile в Java?

«Что делает ключевое слово volatile в Java?» — вопрос из категории Java Core, который задают на 31% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Как это работает:

  • Видимость: Запись в volatile-переменную немедленно сбрасывается в основную память, а чтение — всегда происходит из неё, минуя кеш процессора.
  • Запрет переупорядочивания: Операции с volatile-переменной не могут быть переставлены компилятором или процессором относительно других операций, что обеспечивает happens-before гарантии.

Важное ограничение: volatile не обеспечивает атомарность составных операций (например, count++).

Пример использования для флага остановки:

public class StoppableTask {
    private volatile boolean stopRequested = false;

    public void run() {
        while (!stopRequested) {
            // Выполняем работу
        }
    }

    public void requestStop() {
        stopRequested = true; // Изменение будет сразу видно потоку run()
    }
}

Типичные сценарии:

  • Флаги состояния (запуск/остановка).
  • Публикация результатов инициализации (safe publication).