Вопрос проверяет понимание неблокирующей синхронизации и того, как Java обеспечивает атомарность без synchronized.
Классы Atomic* используют атомарные инструкции процессора.
Основной механизм — операция CAS (Compare-And-Swap).
Операции выполняются без блокировок.
Это позволяет работать быстрее и масштабируемее под нагрузкой.
Классы Atomic* из пакета java.util.concurrent.atomic реализуют атомарность без традиционных блокировок.
Atomic-классы используют неблокирующие алгоритмы на основе CAS (Compare-And-Swap).
CAS — это операция вида:
Сравнить текущее значение с ожидаемым
Если совпадает — записать новое значение
Если нет — операция не выполняется
Все это происходит как одна атомарная инструкция CPU.
Упрощенно:
Поток читает текущее значение
Вычисляет новое
Пытается заменить старое на новое
Если другой поток уже изменил значение — попытка повторяется
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
Внутри:
Читается текущее значение
Вызывается CAS
При неудаче операция повторяется в цикле
Atomic-классы:
Не блокируют потоки
Не переводят поток в состояние ожидания
Лучше масштабируются при большом числе потоков
Важно понимать:
Атомарна одна операция, а не набор
Сложные инварианты трудно поддерживать
Возможны активные повторные попытки (spin)
Atomic-классы реализованы через CAS и неблокирующие алгоритмы.
Они эффективны для простых операций над общими данными.