← Назад к вопросам

В чем суть метода incrementAndGet у AtomicInteger

2.0 Middle🔥 141 комментариев
#JVM и управление памятью#Многопоточность#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Метод incrementAndGet у AtomicInteger

Метод incrementAndGet() в классе AtomicInteger выполняет две операции атомарно (неделимо): увеличивает значение на 1 и возвращает новое значение. Главное отличие — это атомарность, обеспечивающая потокобезопасность без синхронизации.

Как это работает

AtomicInteger counter = new AtomicInteger(5);
int newValue = counter.incrementAndGet(); // Вернёт 6
System.out.println(counter.get()); // Напечатает 6

Важно: операция выполняется неделимо, даже в многопоточной среде. Не может случиться, что один поток начнёт увеличение, а другой прочитает значение в промежутке.

Отличия от похожих методов

AtomicInteger ai = new AtomicInteger(10);

// incrementAndGet() — увеличивает ДО возврата
int result1 = ai.incrementAndGet(); // Вернёт 11

// getAndIncrement() — возвращает ДО увеличения
ai.set(10);
int result2 = ai.getAndIncrement(); // Вернёт 10, потом увеличивает до 11

// После обеих операций значение = 11

Реализация под капотом

AtomicInteger использует CAS (Compare-And-Swap) операции, которые поддерживаются на уровне процессора:

public final int incrementAndGet() {
    return getAndAdd(1) + 1;
}

Практическое применение

Безопасный счётчик в многопоточной среде:

AtomicInteger requestCount = new AtomicInteger(0);

public void handleRequest() {
    int requestId = requestCount.incrementAndGet();
    System.out.println("Обработан запрос №" + requestId);
}

ID генератор:

private static final AtomicInteger idGenerator = new AtomicInteger(0);

public int generateId() {
    return idGenerator.incrementAndGet();
}

Преимущества перед synchronized

  • Нет явной синхронизации — код читается проще
  • Лучшая производительность — CAS быстрее, чем мьютекс
  • Нет deadlock'ов — нет блокировок
  • Масштабируемость — работает хорошо при высокой конкуренции

Используй AtomicInteger (и другие Atomic* классы) для простых операций с примитивными типами в многопоточном коде вместо synchronized блоков. Это проще, безопаснее и быстрее.

В чем суть метода incrementAndGet у AtomicInteger | PrepBro