Ответ
Метод incrementAndGet() класса AtomicInteger атомарно увеличивает текущее значение на единицу и возвращает обновленное значение. Его главное преимущество — потокобезопасность без использования явных блокировок (synchronized).
Принцип работы (на основе CAS): Под капотом используется аппаратная инструкция Compare-And-Swap (CAS).
- Метод читает текущее значение
volatile-переменнойvalue. - Вычисляет новое значение (
current + 1). - Выполняет операцию CAS: если значение
valueвсе еще равноcurrent, оно заменяется наcurrent + 1. В противном случае (значение изменилось другим потоком) шаги 1-3 повторяются в цикле.
Пример использования:
import java.util.concurrent.atomic.AtomicInteger;
public class CounterExample {
private final AtomicInteger threadSafeCounter = new AtomicInteger(0);
public void handleRequest() {
// Атомарный инкремент и получение нового значения
int requestId = threadSafeCounter.incrementAndGet();
System.out.println("Обрабатываем запрос #" + requestId);
}
}
Аналог с synchronized (менее эффективный):
public class SynchronizedCounter {
private int counter = 0;
public synchronized int incrementAndGet() {
return ++counter; // Блокировка всего объекта на время операции
}
}
Ключевые преимущества AtomicInteger.incrementAndGet():
- Неблокирующий алгоритм: Потоки не "засыпают" при конкуренции, а повторяют попытку (оптимистичная блокировка). Это дает выигрыш в производительности при высокой конкуренции.
- Атомарность: Операция "чтение-изменение-запись" выполняется как единое целое, исключая состояние гонки (race condition).
- Масштабируемость: Лучше масштабируется на многоядерных процессорах по сравнению с
synchronized.
Семейство методов:
getAndIncrement()— увеличивает и возвращает старое значение (постфиксный инкремент).decrementAndGet()/getAndDecrement()— для атомарного декремента.addAndGet(int delta)— для атомарного прибавления произвольного числа.