【㉿Java并发】什么是CAS?CAS有什么问题?

什么是CAS

CAS 是compareand swap 的缩写, 即我们所说的比较交换。

CAS 是一种基于锁的操作, 而且是乐观锁。在java 中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后, 下一个线程才可以访问。而乐观锁采取了一种宽泛的态度,通过某种方式不加锁来处理资源, 比如通过给记录加version 来获取数据, 性能较悲观锁有很大的提高。

CAS 操作包含三个操作数 —— 内存位置( V)预期原值(A)新值(B)如果内存地址里面的值和A 的值是一样的,那么就将内存里面的值更新成B。CAS是通过无限循环来获取数据的,若果在第一轮循环中,a 线程获取地址里面的值被b 线程修改了, 那么a 线程需要自旋,到下次循环才有可能机会执行。

java.util.concurrent.atomic 包下的类大多是使用CAS 操作来实现的( AtomicInteger,AtomicBoolean,AtomicLong)。

CAS 的问题

CAS 容易造成ABA 问题

一个线程a 将数值改成了b,接着又改成了a,此时CAS 认为是没有变化, 其实是已经变化过了,而这个问题的解决方案可以使用版本号标识, 每操作一次version加1。在java5 中,已经提供了AtomicStampedReference 来解决问题。

不能保证代码块的原子性

CAS 机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3 个变量共同进行原子性的更新, 就不得不使用synchronized 了。

CAS 造成CPU 利用率增加

CAS 里面是一个循环判断的过程,如果线程一直没有获取到状态,cpu资源会一直被占用。

 

posted @   残城碎梦  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2022-03-19 Junit配合Spring进行单元测试
2022-03-19 了解Spring的框架和包结构
点击右上角即可分享
微信分享提示