CAS原理和ABA问题
CAS(Compare-And-Swap)是Java并发编程中的重要机制,理解CAS对于理解原子类和高并发编程至关重要。
核心问题
CAS是什么?
CAS是一种无锁的原子操作,通过比较内存中的值和期望值,如果相等则更新为新值。
CAS的实现原理
java
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}底层实现:
- 使用Unsafe类的native方法
- CPU提供原子指令(如x86的CMPXCHG)
- 保证操作的原子性
ABA问题
问题描述:
- 线程1读取值A
- 线程2将A改为B,再改回A
- 线程1的CAS操作仍然成功
解决方案:
- 版本号机制:使用AtomicStampedReference
- 时间戳机制:记录修改时间
- 标记位机制:使用标记位区分
使用场景
1. 原子类
java
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // CAS实现2. 乐观锁
- 数据库乐观锁
- 版本控制
- 无锁数据结构
3. 自旋锁
java
while (!cas(lock, 0, 1)) {
// 自旋等待
}常见面试题
CAS的优缺点?
- 优点:无锁,性能好
- 缺点:ABA问题,自旋消耗CPU
CAS和synchronized的区别?
- CAS:乐观锁,无阻塞
- synchronized:悲观锁,阻塞等待
如何解决ABA问题?
- 使用AtomicStampedReference
- 使用版本号或时间戳