主题切换
CAS相关
一、CAS基础概念
CAS全称 Compare And Swap,比较并交换,是乐观锁实现,无锁机制保证共享变量操作原子性。 JUC大量底层依赖CAS:Atomic原子类、AQS同步器、轻量级锁底层均使用CAS。
二、CAS执行流程
包含三个操作数:
- V:主内存当前真实值
- A:线程工作内存预期旧值
- B:需要更新的新值
执行逻辑:
- 比较主内存V与预期值A是否相等;
- 相等:将V修改为B,返回true;
- 不相等:修改失败,不做任何操作,返回false;
- 业务层搭配while循环自旋重试,直到修改成功。
伪代码:
java
while(true){
int old = getMainMemoryValue();
int newVal = old + 1;
if(compareAndSwap(old, newVal)){
break;
}
}三、乐观锁 vs 悲观锁
- CAS(乐观锁) 默认认为并发冲突很少,不加锁;修改失败自旋重试,线程不会阻塞;低并发场景性能高。
- synchronized(悲观锁) 默认一定会发生竞争,直接上锁;未抢到锁线程阻塞,上下文切换开销大;高并发稳定。
四、CAS优缺点
优点
- 无锁,线程不阻塞,无内核态切换开销,低竞争下性能远高于重量级锁;
- 底层CPU硬件原语,原子性有保障。
缺点
- 高并发下自旋循环大量占用CPU,性能急剧下降;
- 存在ABA问题;
- 只能保证单个变量原子操作,无法保证多变量复合操作原子性。
五、底层实现
CAS依赖Unsafe类native方法,底层由操作系统CPU硬件指令实现,具备原子性。
六、面试高频问题解析
问:什么是CAS?
答: CAS是Compare And Swap比较并交换,属于乐观锁。通过对比主内存真实值与本地预期值,相等则更新;失败则自旋重试,无锁保证单变量原子操作,Atomic、AQS底层均基于CAS实现。
问:乐观锁和悲观锁区别,分别对应什么实现?
答: 乐观锁假设冲突少,不加锁,失败自旋,代表CAS;悲观锁假设冲突频繁,提前加锁阻塞线程,代表synchronized。
问:CAS自旋锁有什么优缺点?
答: 优点:无阻塞、无内核切换,低并发性能好;缺点:高并发大量空循环消耗CPU,存在ABA问题,仅支持单个变量原子操作。
问:CAS底层依靠什么实现?
答: 依赖Unsafe类本地native方法,底层调用CPU硬件原语,硬件层面保证操作不可分割。
问:CAS和synchronized适用场景?
答: 竞争少、短耗时逻辑用CAS;并发激烈、长时间持有资源用synchronized,避免无限自旋消耗CPU。