Concurrent Addition and Subtraction (Сложение и Вычитание в Конкурентной Среде) - часто шуточное толкование, на самом деле Compare-And-Swap.
Atomic-операция, которая атомарно сравнивает значение в памяти с ожидаемым значением и, если они совпадают, обновляет его новым значением.
Аналогично псевдокоду:
plaintext
Применяется в низкоуровневых примитивах синхронизации и неблокирующих алгоритмах для обеспечения потокобезопасности без использования блокировок (мьютексов, семафоров). Java предоставляет поддержку CAS через классы из пакета java.util.concurrent.atomic, например:
AtomicInteger
AtomicLong
AtomicReference
Пример использования AtomicInteger:
java
Преимущества:
- Неблокирующий: Потоки не блокируют друг друга при попытке выполнения CAS.
- Высокая производительность: На многопроцессорных системах может быть быстрее блокировок из-за отсутствия накладных расходов на переключение контекста.
Недостатки:
- Проблема ABA: Если значение изменялось с A на B, а затем снова на A между чтением и выполнением CAS, операция будет считаться успешной, даже если значение фактически изменилось. Некоторые классы (например, AtomicStampedReference) решают эту проблему, добавляя "метку" (stamp).
- Spurious wakeups: Потоки могут "вертеться" (spin) в цикле, пытаясь выполнить CAS, что потребляет ресурсы процессора.
- Сложность: Разработка неблокирующих алгоритмов с использованием CAS может быть сложнее, чем с использованием блокировок.