什么是CAS?CAS有什么问题?

什么是CAS

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

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

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

CAS 的问题

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

2、不能保证代码块的原子性
CAS 机制所保证的知识一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3 个变量共同进行原子性的更新, 就不得不使用synchronized 了。
3、CAS 造成CPU 利用率增加

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

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值