В чем преимущество AtomicInteger перед обычным Integer в многопоточном Java-приложении?

«В чем преимущество AtomicInteger перед обычным Integer в многопоточном Java-приложении?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

AtomicInteger предоставляет потокобезопасные атомарные операции над целочисленным значением, используя низкоуровневые механизмы процессора (чаще всего CAS — Compare-And-Swap), что обычно эффективнее явной синхронизации с помощью synchronized.

Ключевые отличия и преимущества:

  • Integer — неизменяемый (immutable) класс. Для изменения значения Integer в нескольких потоках требуется внешняя синхронизация, что сложнее и может стать узким местом.
  • AtomicInteger — предоставляет методы для атомарных операций чтения-изменения-записи, такие как incrementAndGet(), addAndGet(), compareAndSet().

Пример использования AtomicInteger как счетчика:

import java.util.concurrent.atomic.AtomicInteger;

public class CounterExample {
    private AtomicInteger threadSafeCounter = new AtomicInteger(0);

    public void increment() {
        // Операция атомарна и не требует synchronized
        threadSafeCounter.incrementAndGet();
    }

    public int getCount() {
        return threadSafeCounter.get();
    }
}

Практическое применение: AtomicInteger идеально подходит для высокопроизводительных счетчиков, генераторов ID или флагов состояния в многопоточной среде, где важна производительность без блокировок.