Является ли операция инкремента (i++) атомарной в Java?

«Является ли операция инкремента (i++) атомарной в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Операция инкремента (i++) в Java не является атомарной. Она выполняется в три этапа:

  1. Чтение текущего значения переменной.
  2. Увеличение этого значения на единицу.
  3. Запись нового значения обратно в переменную.

В многопоточной среде между этими этапами может вмешаться другой поток, что приводит к состоянию гонки (race condition) и потере обновлений.

Пример небезопасного инкремента:

private int counter = 0;

public void unsafeIncrement() {
    counter++; // Не атомарно!
}

Решение: использование атомарных классов Для атомарных операций с числами используйте java.util.concurrent.atomic, например, AtomicInteger:

private AtomicInteger counter = new AtomicInteger(0);

public void safeIncrement() {
    counter.incrementAndGet(); // Гарантированно атомарная операция
}

Альтернативой является использование синхронизации (synchronized) или volatile, но AtomicInteger обычно эффективнее для данной задачи.