首页 > 编程语言 >Java 之 CAS 原理及实现是怎样的?

Java 之 CAS 原理及实现是怎样的?

时间:2022-12-25 22:25:20浏览次数:61  
标签:候选者 面试官 Java CAS 修改 线程 内存 原理



面试官今天我们来聊聊CAS吧?你对CAS了解多少?

候选者:好,CAS的全称为compare and swap,比较并交换

候选者:虽然翻译过来是「比较并交换」,但它是一个原子性的操作,对应到CPU指令为cmpxchg

面试官:好家伙,CPU指令你都知道?

候选者:这没什么,都是背的。

面试官:….

候选者:回到CAS上吧,CAS的操作其实非常简单。

候选者:CAS 有三个操作数:当前值A、内存值V、要修改的新值B

候选者:假设 当前值A 跟 内存值V 相等,那就将 内存值V 改成B

候选者:假设 当前值A 跟 内存值V 不相等,要么就重试,要么就放弃更新

候选者:将当前值与内存值进行对比,判断是否有被修改过,这就是CAS的核心

 

 

面试官:确实,那为什么要用CAS呢?

候选者:嗯,要讲到CAS就不得不说synchronized锁了,它是Java锁…然后…

面试官:稍微打断一下,synchronized锁你稍微讲下就好了,后面会专门问的,在这不用细讲。

候选者:ok,其实就是synchronized锁每次只会让一个线程去操作共享资源

候选者而CAS相当于没有加锁,多个线程都可以直接操作共享资源,在实际去修改的时候才去判断能否修改成功

候选者:在很多的情况下会synchronized锁要高效很多

候选者:比如,对一个值进行累加,就没必要使用synchronized锁,使用juc包下的Atomic类就足以。

面试官:了解,那你知道CAS会有什么缺点吗?

候选者CAS有个缺点就是会带来ABA的问题

候选者:从CAS更新的时候,我们可以发现它只比对当前值和内存值是否相等,这会带来个问题,下面我举例说明下:

候选者:假设线程A读到当前值是10,可能线程B把值修改为100,然后线程C又把值修改为10。

候选者:等到线程A拿到执行权时,因为当前值和内存值是一致的,线程A是可以修改的!

候选者:站在线程A的角度来说,这个值是从未被修改的(:

候选者:这是不合理的,因为我们从上帝的角度来看,这个变量已经被线程B和线程C修改过了。

候选者:这就是所谓的ABA问题

 

 

候选者:要解决ABA的问题,Java也提供了AtomicStampedReference类供我们用,说白了就是加了个版本,比对的就是内存值+版本是否一致

面试官:嗯,了解。

面试官阿里巴巴开发手册提及到 推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数),你能帮我解读一下吗

候选者:AtomicLong做累加的时候实际上就是多个线程操作同一个目标资源

候选者:在高并发时,只有一个线程是执行成功的,其他的线程都会失败,不断自旋(重试),自旋会成为瓶颈

候选者:而LongAdder的思想就是把要操作的目标资源「分散」到数组Cell中

候选者:每个线程对自己的 Cell 变量的 value 进行原子操作,大大降低了失败的次数

候选者:这就是为什么在高并发场景下,推荐使用LongAdder 的原因(:

面试官:OK

标签:候选者,面试官,Java,CAS,修改,线程,内存,原理
From: https://www.cnblogs.com/shoshana-kong/p/17004750.html

相关文章

  • CAS原理
     目录CAS简介CAS思路CAS使用场景CAS问题总结CAS简介CAS的英文全称是Compare-And-Swap,意思就是比较并交换,他是原子类的底层原理,同时也是乐观锁的原理,CAS的特点......
  • java 学习
    javacJunior.javajavaJunior  Employee.java//importjava.io.*;//下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类publicclass......
  • SAP UI5 应用里 FlexBox 控件的设计原理
    sap.m.FlexBox控件为flexibleboxlayout构建容器。VBox控件为垂直的框布局(verticalflexibleboxlayout)构建容器。VBox是一种使用的控件,因为它只是一个定制化的......
  • BFS场景样例测试--最短路径--用Java实现
    我们今天研究下最短路径用BFS来实现 首先确定数据结构/***二叉树数据结构节点*/publicclassTreeNode{intvalue;TreeNodeleft;TreeNoder......
  • Java编程思想13
    第十八章:JavaI/O系统对程序语言的设计者而言,创建一个好的输入/输出(I/O)系统是一项艰难的任务。File类既能代表一个特定文件的名称,又能代表一个目录下一组文件的名称。下......
  • BFS场景样例测试--层次遍历--用Java实现
    我们今天研究下层次便利用BFS来实现 首先确定数据结构/***二叉树数据结构节点*/publicclassTreeNode{intvalue;TreeNodeleft;TreeNoderi......
  • SIFT特征原理简析(HELU版)
    SIFT(Scale-InvariantFeatureTransform)是一种具有尺度不变性和光照不变性的特征描述子,也同时是一套特征提取的理论,首次由D.G.Lowe于2004年以《DistinctiveImageFeatu......
  • java技术路线
      第一阶段:Java基础学习Java基础知识,可供选择的书很多,但它们大都有着一个缺点,那就是内容庞杂,有些内容脱离实际,甚至是过时。对此,在这一阶段,我精选了Java的基础知识,核心......
  • Java注解反射
    注解与反射内置注解@Oreride:定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明。@Deprecated:定义在java.lang.Depr......
  • 教你用JavaScript实现调皮的字母
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,制作提高打字速度的小游戏-调皮的字母。点击与屏幕上字母相对应的按键,......