Вопрос с собеседования · Java

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

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

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

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

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

Подробно

Операция 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 обеспечит корректный счётчик.
  • Считать операции атомарного класса блокирующими.

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования