什么是CAS
- 一种思想,一种算法,用在并发的场景下
- 我认为内存值V应该是A,如果是的话我就把它改成B,如果不是A说没就被别人改过了,那我就不修改了,避免多人修改导致出错
- CAS有三个操作数:内存值V,预期值A,修改值B,并且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做,最后返回现在的V值
演示CAS核心原理
通过代码模拟CAS的操作
/** * 描述: 模拟CAS操作,等价代码 */ public class SimulatedCAS { private volatile int value; public synchronized int compareAndSwap(int expectedValue, int newValue) { //内存值V int oldValue = value; //预期值A等于内存值V if (oldValue == expectedValue) { //将修改值B赋值给内存值V value = newValue; } //返回内存值V return oldValue; } }
CAS应用场景
- 乐观锁的底层实现
- 并发容器底层有应用,如ConcurrentHashMap
- 原子类底层有应用
CAS的缺点
-
ABA问题:内存值V被其他线程多次修改,最终又改回了预期值A,但是这种修改再上述规则发现不了。
- 举例:预期值为5,内存值最初为5,被另一个线程改为7,然后又被改成5,此时预期值与内存值进行值的比较发现没有变化,就认为中途没有其他线程操作
- 优化方案,类比数据库中的乐观锁,对数据加上版本号
-
自旋循环时间长开销大
-
只能保证一个共享变量的原子操作
本文参考了
- 视频课程: 《玩转Java并发工具》
- 书籍:《Java并发编程的艺术》
更多Java面试复习笔记和总结可访问我的面试复习专栏《Java面试复习笔记》,或者访问我另一篇博客《Java面试核心知识点汇总》查看目录和直达链接