Насколько эффективен AtomicInteger в качестве счетчика при высокой конкуренции потоков?

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

Ответ

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

Принцип работы и пример:

AtomicInteger counter = new AtomicInteger(0);
// Многопоточный инкремент:
counter.incrementAndGet(); // Атомарная операция
Плюсы и минусы при высокой нагрузке: Плюсы Минусы (при high contention)
Нет блокировок (lock-free) Многочисленные повторные попытки CAS при одновременном доступе
Хорошая производительность при умеренной конкуренции Производительность падает из-за постоянных перезаписей кэша процессора

Альтернатива для высоконагруженных счетчиков: LongAdder.

  • Хранит значение в виде набора ячеек, уменьшая contention.
  • Лучшая производительность при частой записи, но чуть медленнее при чтении.
    LongAdder adder = new LongAdder();
    adder.increment(); // Оптимизировано для записи
    long sum = adder.sum(); // Чтение требует агрегации ячеек