一、背景
为什么要有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检查时发现没有变,因为起始和结束时值没有发生变化,就去更新,但是在上面两步过程中值其实已经发生了变化。
解决方案: 添加版本号或时间戳的校验
开销问题
长时间自旋不成功,有开销问题。