Какие основные операции предоставляет класс AtomicInteger в Java?

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

Ответ

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), что обеспечивает высокую производительность в условиях высокой конкуренции, избегая накладных расходов на переключение контекста потока.