CAS原理与ABA问题详解
请解释CAS(Compare-And-Swap)的工作原理、在Java中的实现方式(Unsafe类)以及ABA问题及其解决方案。
回答
Yahuda
CAS原理:
- 三个操作数:内存地址V、期望值A、新值B。
- 如果V的值等于A,则将V更新为B,否则不更新。
- 原子操作,依赖CPU指令(cmpxchg)。
Java实现:
Unsafe.compareAndSwapInt/Object/Long等native方法。- JUC原子类(AtomicInteger/AtomicReference等)封装了CAS操作。
ABA问题:
- 线程1读取A的值,线程2将A改为B又改回A,线程1CAS成功但实际值已被修改过。
- 影响:多数场景下无影响(如计数器),但链表结构可能引发问题。
解决方案:
- AtomicStampedReference:带版本号(stamp)。每次修改时stamp+1,比较值+版本号。
- AtomicMarkableReference:带布尔标记。
- 示例:
AtomicStampedReference<Integer> ref = new AtomicStampedReference<>(100, 0);