Что такое операция Compare-and-swap (CAS) в Java?

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

Ответ

Compare-and-swap (CAS) — это атомарная инструкция, используемая для реализации безблокировочных (lock-free) алгоритмов в многопоточном программировании. Она сравнивает текущее значение в памяти с ожидаемым (expected) и, если они совпадают, атомарно устанавливает новое значение (update).

Принцип работы:

// Псевдокод операции CAS
boolean compareAndSwap(sharedVariable, expectedValue, newValue) {
    if (sharedVariable == expectedValue) {
        sharedVariable = newValue;
        return true; // Успех
    }
    return false; // Неудача
}

Пример использования в Java (java.util.concurrent.atomic):

import java.util.concurrent.atomic.AtomicInteger;

AtomicInteger atomicInt = new AtomicInteger(5);

// Попытка изменить значение с 5 на 10
boolean success = atomicInt.compareAndSet(5, 10);
System.out.println(success); // true, если текущее значение было 5
System.out.println(atomicInt.get()); // 10

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

  • Атомарность: Операция выполняется как единое целое (поддерживается на уровне процессора, например, инструкция CMPXCHG в x86).
  • Без блокировок (lock-free): Потоки не блокируются, а повторяют попытку при неудаче, что повышает производительность в условиях высокой конкуренции.
  • ABA-проблема: CAS может "успешно" выполниться, если значение переменной изменилось с A на B и обратно на A между чтением и записью. Для её решения используются AtomicStampedReference или AtomicMarkableReference.
  • Применение: Основа для атомарных классов (AtomicInteger, AtomicReference), неблокирующих коллекций (ConcurrentHashMap) и механизмов синхронизации.