直接回答:CAS(Compare-And-Swap)是一条 CPU 原子指令:比较内存位置 V 的值是否等于期望值 E,相等则更新为新值 N,整个"比较+交换"不可分割。x86 上对应 cmpxchg 指令(多核下配合 LOCK 前缀保证缓存一致性)。Java 中通过 Unsafe.compareAndSwapXxx 暴露,AtomicInteger 等原子类基于它实现。

展开解析:CAS 属于乐观锁/无锁(lock-free)思路:失败时通常自旋重试,避免了线程挂起与唤醒的开销,在低竞争下性能优于悲观锁。但存在三个问题:

  1. 自旋开销:竞争激烈时大量线程空转烧 CPU;
  2. 只能保证单个变量的原子性,多个变量仍需锁;
  3. ABA 问题:值从 A 变成 B 又变回 A,CAS 检查时"看起来没变",但中间过程可能破坏了业务不变量(如链表结构被改过)。

ABA 的解决:引入版本号/时间戳,每次修改版本号递增,比较时同时校验值与版本。JDK 提供 AtomicStampedReference(值 + int 版本戳);若只关心是否变化过,可用 AtomicMarkableReference(值 + 布尔标记)。

AtomicStampedReference<Integer> ref = new AtomicStampedReference<>(100, 1);
ref.compareAndSet(100, 101, 1, 2); // 期望值、新值、期望版本、新版本

追问LongAdder 为什么比 AtomicLong 在高并发下更快(分段思想)、Unsafe 的内存语义。