什么是CAS机制?如何解决ABA问题?

 


synchronized关键字会让没获得锁资源的线程进入BLOCKED(阻塞)状态,只有在争夺到锁资源的时候才转换成RUNNABLE(运行)状态。这其中涉及到操作系统中用户模式和内核模式之间的切换,代价比较高。

同时,尽管jdk对synchronized关键字进行了优化,增加了从偏向锁到轻量级锁再到重量级锁的过度,但是在最终转变为重量级锁之后,性能依然比较低,所以面对这种只对单个变量进行原子性的操作,最好使用jdk自带的“原子操作类”。

原子操作类,指的是java.util.concurrent.atomic包下,一系列以Atomic开头的包装类。例如AtomicBoolean、AtomicInteger、AtomicXXX都是分别对应Boolean、Integer或其他类型的原子性操作。

现在我们采用AtomicInteger类试一下

 


输出结果如下:

 

 

 

从思想上来看,synchronized属于悲观锁,悲观的认为程序中的并发问题十分严重,所以严防死守,只让一个线程操作该代码块。而CAS属于乐观锁,乐观地认为程序中的并发问题并不那么严重,所以让线程不断的去尝试更新。
在java中除了上面提到的Atomic操作类,以及Lock系列类的底层实现,甚至在jdk1.6以上,在synchronized转变为重量级锁之前,也会采用CAS机制。

CAS的优点自然是在并发问题不严重的时候性能比synchronized要快,缺点也有。
————————————————
版权声明:本文为CSDN博主「小问号阿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41832850/article/details/100095677

 

 


使用原子操作类之后,最终的输出结果同样是200,保证了线程安全。并且在某种情况下,该方案代码的性能会比synchronized更好。

而Atomic操作类的底层正是用到了"CAS机制"。
首先,CAS的英文单词是Compare and Swap,即是比较并替换。

CAS机制中使用了3个基本操作数:内存地址V,旧的预期值A,需要替换的值B。

它的规则是:当需要更新一个变量的值的时候,只有当变量的预期值A和内存地址V中的实际值相同的时候,才会把内存地址V对应的值替换成B。

————————————————
版权声明:本文为CSDN博主「小问号阿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41832850/article/details/100095677

 

 

1.Java语言CAS底层是如何实现的?

答:利用unsafe提供的原子性操作方法。

2.什么是ABA问题?怎么解决?

答:当一个值从A更新为B,再从B更新为A,普通CAS机制会误判通过检测。解决方案是使用版本号,通过比较值和版本号才判断是否可以替换。

posted @   飞翔的小鸟er  阅读(150)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示