Почему i++ не атомарен?

Ответ

Это три операции: прочитать значение → прибавить 1 → записать обратно. Два потока могут одновременно прочитать одно значение, оба прибавить, оба записать — будет +1 вместо +2 (lost update). Атомарность даёт AtomicInteger или synchronized; volatile обеспечивает только видимость.

Разбор: i++ компилируется в три отдельных шага (read-modify-write), и без атомарности эти шаги могут чередоваться у разных потоков, давая потерянное обновление. Ловушка: volatile гарантирует только видимость, но НЕ атомарность составной операции, а одной машинной инструкции inc у JVM-поля нет; атомарный инкремент даёт AtomicInteger или synchronized.

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

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