Что делает класс AtomicInteger?
- Что такое 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 не решает задачу счётчика?
- Что происходит при высокой конкуренции за одно значение?
Разбор темы
- volatile, атомарность и CAS
Разница видимости и атомарности, atomic-классы, compare-and-swap и ABA, контеншн и LongAdder.
Связанные вопросы
- Чем LongAdder выигрывает у AtomicLong при высокой конкуренции и в чём его ограничение? Middle
- Что гарантирует ключевое слово volatile для переменной? Middle
- Что такое ABA-проблема в алгоритмах на CAS? Senior
- Два потока одновременно вызывают incrementAndGet() у одного AtomicInteger. Что при этом происходит внутри и почему ни один инкремент не теряется? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.