Compare-And-Swap,是一种无锁算法,用于实现乐观锁。
传入参数有内存地址V,旧值A,新值B。只有当V上的值与A相等时才会更新为B。
通常情况下需要结合自旋使用。
在 Linux 中使用了
cmpxchg
(即 Compare and Exchange)指令,该指令是原子操作。CAS 操作存在的问题:
- ABA 问题
- 循环时间长
- 只支持单个共享变量的原子操作
ABA 问题可以通过添加版本号解决,变化过程由 "A->B->A" 变为 "1A->2B->3A"。
JDK提供了
AtomicStampedReference
类来解决ABA问题,具体操作封装在compareAndSet()
中。compareAndSet()
首先检查当前引用和当前标志与预期引用和预期标志是否相等,如果都相等则以原子方式将引用值和标志的值设置为给定的更新值。