Что такое операция Compare And Set (CAS) и как она используется в Java?

«Что такое операция Compare And Set (CAS) и как она используется в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Compare And Set (CAS) — это атомарная (неразрывная) низкоуровневая операция, которая обновляет значение переменной только в том случае, если её текущее значение совпадает с ожидаемым.

Принцип работы: if (currentValue == expectedValue) { currentValue = newValue; return true; } else { return false; }

Пример в Java (AtomicInteger):

AtomicInteger atomicInt = new AtomicInteger(5);

// Поток 1: Проверяет, равно ли значение 5, и если да, меняет на 10.
boolean success1 = atomicInt.compareAndSet(5, 10); // success1 = true

// Поток 2: Пытается сделать то же самое, но значение уже 10.
boolean success2 = atomicInt.compareAndSet(5, 15); // success2 = false

Ключевые особенности и применение:

  • Основа неблокирующих алгоритмов. Поток, получивший false, может повторить попытку (стратегия loop-and-retry), избегая блокировок (synchronized).
  • Аппаратная поддержка. Реализуется одной инструкцией процессора (например, CMPXCHG в x86), что обеспечивает атомарность.
  • Используется в java.util.concurrent.atomic (AtomicInteger, AtomicReference), а также внутри ConcurrentHashMap, Lock-Free очередей и других структур из пакета java.util.concurrent.