Skip to content
作者:daily5am创建:-更新:-
字数:预计阅读: 分钟访问量:--

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操作仍然成功

解决方案:

  1. 版本号机制:使用AtomicStampedReference
  2. 时间戳机制:记录修改时间
  3. 标记位机制:使用标记位区分

使用场景

1. 原子类

java
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();  // CAS实现

2. 乐观锁

  • 数据库乐观锁
  • 版本控制
  • 无锁数据结构

3. 自旋锁

java
while (!cas(lock, 0, 1)) {
    // 自旋等待
}

常见面试题

  1. CAS的优缺点?

    • 优点:无锁,性能好
    • 缺点:ABA问题,自旋消耗CPU
  2. CAS和synchronized的区别?

    • CAS:乐观锁,无阻塞
    • synchronized:悲观锁,阻塞等待
  3. 如何解决ABA问题?

    • 使用AtomicStampedReference
    • 使用版本号或时间戳