Получить доступ

Что делает класс AtomicInteger?

JuniorМногопоточность
Ещё спрашивают так:
  • Что такое CAS?
  • Почему i++ не атомарна?
  • Чем AtomicInteger отличается от volatile int?
Коротко

AtomicInteger выполняет операции вроде инкремента атомарно без блокировок — на аппаратной инструкции CAS (сравнение с обменом).

  • i++ — три шага (прочитать, увеличить, записать), между ними вклинится другой поток
  • volatile даёт видимость, но не атомарность составной операции

А ещё При высокой конкуренции счётчика быстрее LongAdder

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Операция count++ выглядит одной, но состоит из трёх: прочитать значение, прибавить единицу, записать. Если два потока выполняют её одновременно, оба прочитают одно и то же значение — одно обновление потеряется.

AtomicInteger решает это через CAS (compare-and-swap): процессор атомарно записывает новое значение, только если текущее совпадает с ожидаемым. Если за это время значение изменил другой поток, операция повторяется с новым значением. Блокировок нет, потоки не засыпают, поэтому при умеренной конкуренции это быстрее synchronized.

Методы: incrementAndGet, addAndGet, compareAndSet, updateAndGet, accumulateAndGet. Есть AtomicLong, AtomicBoolean, AtomicReference.

volatile int эту задачу не решает: он гарантирует, что потоки увидят последнее записанное значение, но ++ над ним остаётся неатомарным.

При очень высокой конкуренции за один счётчик CAS начинает часто повторяться — для этого есть LongAdder, который распределяет счёт по ячейкам и суммирует при чтении.

Пример

AtomicInteger requests = new AtomicInteger();
requests.incrementAndGet();                       // атомарно
requests.updateAndGet(v -> Math.min(v + 10, 100)); // атомарно с логикой

Что хотят услышать

  • Почему i++ не атомарна.
  • CAS как механизм и отсутствие блокировок.
  • Отличие от volatile.
  • LongAdder — плюс.

Частые ошибки

  • Рассчитывать, что volatile обеспечит корректный счётчик.
  • Считать операции атомарного класса блокирующими.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Позволяет выполнять операции вроде инкремента атомарно, без блокировок — на основе аппаратной инструкции сравнения с обменом
  • ✗Просто хранит целое число с большей точностью
  • ✗Синхронизирует доступ, захватывая монитор при каждой операции
  • ✗Гарантирует, что значение не изменится после создания

Что спросят дальше

  • Почему volatile не решает задачу счётчика?
  • Что происходит при высокой конкуренции за одно значение?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем