什么是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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?