文章目录
一、背景
为什么要有 CAS,它解决了什么问题?
- 解决锁机制的性能问题
- 用于无锁并发编程
无锁表现在: CAS 通过硬件指令(如 CPU 的 cmpxchg)直接实现原子操作,线程不会阻塞,而是通过不断重试(自旋)直到成功。
避免死锁,因为根本没有锁。
二、和传统锁的对比
一个例子i++
非原子操作
int i = 0; i++; // 线程不安全
传统锁方案
synchronized(lock) { i++; // 通过锁保证原子性,性能较低 }
CAS 方案
AtomicInteger atomicInteger = new AtomicInteger(0); int res = atomicInteger.incrementAndGet(); // 内部使用 CAS 保证原子性
三、实际的使用

四、存在的问题
(一)ABA 问题
如果值的变化过程如下所示
- A -> B
- B -> A
CAS 检查时发现没有变,因为起始和结束时值没有发生变化,就去更新,但是在上面两步过程中值其实已经发生了变化。
解决方案: 添加版本号或时间戳的校验
(二)开销问题
长时间自旋不成功,有开销问题。
(三)只能保证一个共享变量的原子问题
那么如何保证多个共享变量的原子问题? todo Java 从 1.5 开始 JDK 提供了 AtomicReference 类来保证引用对象之间的原子性,可以把多个变量放在一个对象里来进行 CAS 操作。