什么是 CAS?

CAS(Compare And Swap,比较并交换)是并发编程中一种 无锁(Lock-Free) 的原子操作机制,用于在多线程环境下实现数据的安全更新。它通过硬件指令直接支持,避免了传统锁机制的开销,是现代高性能并发库(如 Java 的 Atomic 类)的核心实现基础。

CAS 操作包含三个参数:

  1. 内存位置(V):需要更新的变量(如共享变量的内存地址)。
  2. 预期原值(A):线程认为该变量当前应该具有的值。
  3. 新值(B):希望将变量更新为的值。

执行过程

  1. 检查内存位置 V 的当前值是否等于预期值 A
  2. 如果相等,将 V 的值更新为 B
  3. 如果不相等,说明其他线程已修改了 V,本次操作失败(不更新)。

原子性保证
整个比较和交换过程由 硬件指令(如 CPU 的 cmpxchg 直接支持,确保不可中断。

happens-before 和 as-if-serial 有啥区别?

特性 happens-before as-if-serial
核心目标 多线程操作的可见性和有序性 单线程执行结果的正确性
重排序允许性 允许(受规则约束) 允许(只要不影响结果)
依赖关系 跨线程操作间的顺序约束 单线程内数据依赖约束
实现机制 JMM 规则(如锁、volatile、final等) 编译器/处理器优化

核心区别

  • happens-before
    解决多线程环境下操作的可见性有序性问题。
    • 例如:线程 A 对变量 x 的写操作对线程 B 可见。
    • 规则示例:
      • 锁的释放操作 happens-before 后续锁的获取操作。
      • volatile 变量的写操作 happens-before 后续读操作。
  • as-if-serial
    保证单线程内代码的执行结果与按程序顺序执行的结果一致,允许编译器和处理器对指令进行重排序优化。
    • 例如:单线程中 a=1; b=2; 可能被重排序为 b=2; a=1;,但结果不受影响。