CodeWalk

CAS原理与ABA问题详解

作者:Yahuda · 2026-05-30 12:55

请解释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);