Перейти к содержимому
Java

Почему volatile не делает counter++ потокобезопасным?

volatile даёт видимость, но инкремент остаётся последовательностью чтения, вычисления и записи.

Middle26 августа 2026 г.
ConcurrencyJVM

volatile гарантирует, что поток читает актуальное значение и публикует свою запись. Но counter++ не одна операция: нужно прочитать число, прибавить единицу и записать результат. Два потока могут прочитать одно и то же значение и оба записать одинаковый результат, потеряв один инкремент.

Для счётчика нужен механизм, который защищает всю read-modify-write последовательность: synchronized, Lock или подходящий атомарный тип, например AtomicInteger. volatile уместен для флага состояния, когда достаточно видимости одной записи.

Подробнее: Java Memory Model: visibility, ordering и happens-before.

← Все вопросы и ответы