什么是 CAS?
CAS(Compare And Swap,比较并交换)是并发编程中一种 无锁(Lock-Free) 的原子操作机制,用于在多线程环境下实现数据的安全更新。它通过硬件指令直接支持,避免了传统锁机制的开销,是现代高性能并发库(如 Java 的 Atomic
类)的核心实现基础。
CAS 操作包含三个参数:
- 内存位置(V):需要更新的变量(如共享变量的内存地址)。
- 预期原值(A):线程认为该变量当前应该具有的值。
- 新值(B):希望将变量更新为的值。
执行过程:
- 检查内存位置
V
的当前值是否等于预期值A
。 - 如果相等,将
V
的值更新为B
。 - 如果不相等,说明其他线程已修改了
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 后续读操作。
- 例如:线程 A 对变量
- as-if-serial:
保证单线程内代码的执行结果与按程序顺序执行的结果一致,允许编译器和处理器对指令进行重排序优化。- 例如:单线程中
a=1; b=2;
可能被重排序为b=2; a=1;
,但结果不受影响。
- 例如:单线程中