volatile: что гарантирует и почему недостаточно для i++?

Ответ

Видимость (запрет кэширования), happens-before (volatile write → read), запрет reordering. i++ = read+increment+write — три операции. Между ними другой поток может прочитать старое значение. Решения: AtomicInteger (CAS) или synchronized.

Разбор: volatile даёт видимость, happens-before и запрет reordering, но НЕ атомарность составных операций. i++ — это read-modify-write из трёх шагов, между которыми вклинивается другой поток, теряя инкременты. Дистракторы ошибочно приписывают volatile атомарность или сводят проблему к reordering/разрядности, тогда как корень в неатомарности RMW; решают её CAS (AtomicInteger) или синхронизация.

Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.

Заказать гайд Пройти тест
новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться