Skip to content

CAS相关

一、CAS基础概念

CAS全称 Compare And Swap,比较并交换,是乐观锁实现,无锁机制保证共享变量操作原子性。 JUC大量底层依赖CAS:Atomic原子类、AQS同步器、轻量级锁底层均使用CAS。

二、CAS执行流程

包含三个操作数:

  1. V:主内存当前真实值
  2. A:线程工作内存预期旧值
  3. B:需要更新的新值

执行逻辑:

  1. 比较主内存V与预期值A是否相等;
  2. 相等:将V修改为B,返回true;
  3. 不相等:修改失败,不做任何操作,返回false;
  4. 业务层搭配while循环自旋重试,直到修改成功。

伪代码:

java
while(true){
    int old = getMainMemoryValue();
    int newVal = old + 1;
    if(compareAndSwap(old, newVal)){
        break;
    }
}

三、乐观锁 vs 悲观锁

  1. CAS(乐观锁) 默认认为并发冲突很少,不加锁;修改失败自旋重试,线程不会阻塞;低并发场景性能高。
  2. synchronized(悲观锁) 默认一定会发生竞争,直接上锁;未抢到锁线程阻塞,上下文切换开销大;高并发稳定。

四、CAS优缺点

优点

  1. 无锁,线程不阻塞,无内核态切换开销,低竞争下性能远高于重量级锁;
  2. 底层CPU硬件原语,原子性有保障。

缺点

  1. 高并发下自旋循环大量占用CPU,性能急剧下降;
  2. 存在ABA问题;
  3. 只能保证单个变量原子操作,无法保证多变量复合操作原子性。

五、底层实现

CAS依赖Unsafe类native方法,底层由操作系统CPU硬件指令实现,具备原子性。

六、面试高频问题解析

  1. 问:什么是CAS?

    答: CAS是Compare And Swap比较并交换,属于乐观锁。通过对比主内存真实值与本地预期值,相等则更新;失败则自旋重试,无锁保证单变量原子操作,Atomic、AQS底层均基于CAS实现。

  2. 问:乐观锁和悲观锁区别,分别对应什么实现?

    答: 乐观锁假设冲突少,不加锁,失败自旋,代表CAS;悲观锁假设冲突频繁,提前加锁阻塞线程,代表synchronized。

  3. 问:CAS自旋锁有什么优缺点?

    答: 优点:无阻塞、无内核切换,低并发性能好;缺点:高并发大量空循环消耗CPU,存在ABA问题,仅支持单个变量原子操作。

  4. 问:CAS底层依靠什么实现?

    答: 依赖Unsafe类本地native方法,底层调用CPU硬件原语,硬件层面保证操作不可分割。

  5. 问:CAS和synchronized适用场景?

    答: 竞争少、短耗时逻辑用CAS;并发激烈、长时间持有资源用synchronized,避免无限自旋消耗CPU。

Powered by VitePress 1.6.4 | 持续更新中