Ответ
AtomicInteger из пакета java.util.concurrent.atomic предоставляет атомарные (потокобезопасные) операции над значением int без использования явных блокировок (synchronized). Основные операции:
1. Атомарное обновление с возвратом значения:
AtomicInteger ai = new AtomicInteger(0);
int newVal = ai.incrementAndGet(); // ++i → возвращает 1
int oldVal = ai.getAndIncrement(); // i++ → возвращает 1, значение становится 2
int sum = ai.addAndGet(5); // i+=5 → возвращает новое значение (7)
int pre = ai.getAndAdd(5); // возвращает старое значение (7), затем i+=5 (12)
int dec = ai.decrementAndGet(); // --i
int preDec = ai.getAndDecrement(); // i--
2. Условная установка (Compare-And-Swap - CAS):
// Установит значение 20, только если текущее значение равно 12.
boolean success = ai.compareAndSet(12, 20);
Это основа многих неблокирующих алгоритмов.
3. Получение и простая установка:
int current = ai.get(); // Чтение
ai.set(42); // Безусловная установка
ai.lazySet(100); // "Ленивая" установка (быстрее, но видимость другим потокам не гарантируется немедленно)
4. Функциональное обновление (Java 8+):
// Атомарно применяет функцию к текущему значению
int updated = ai.updateAndGet(x -> x * 2);
int previous = ai.getAndUpdate(x -> x + 10);
// Атомарно вычисляет новое значение на основе текущего
int accumulated = ai.accumulateAndGet(5, (prev, x) -> prev + x);
Преимущество перед synchronized: Операции AtomicInteger обычно выполняются на уровне процессорных инструкций (CAS), что обеспечивает высокую производительность в условиях высокой конкуренции, избегая накладных расходов на переключение контекста потока.