Ответ
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(); // Чтение требует агрегации ячеек