Ответ
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) и механизмов синхронизации.