Многопоточность middle
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.