CAS是什么?

首先第一个问题CAS是什么?

CAS的Comple And Swap的缩写,简单翻译过来就是比较 并且 覆盖。

在CAS机制中存在三个基本操作值,V内存值,A旧预期值,B预期值。

举个例子如图:



1、线程一进入内存值V为10,然后,老预期值A为10,预期值B为11,然后进行重新赋值V=11;
2、B与A同时进入线程,所以同样获取老预期值B为10,(此时线程一已经操作完成,并且把主内存的值更新为11),然后进行加一操作,此时会把V内存值(此时已经被线程一更改为11)跟旧预期值比较,如果一致,则进行更改内存值。假如内存值跟老预期值不一致,则进行循环操作,再次获取内存值,然后设置老预估值,然后进行加一计算出预估值,然后进行内存值与老期待值进行对标(V与A对比,如果通过对比),覆盖内存V的值。

(乐观锁,缺点是对cpu计算量损耗大,因为一直循环操作.CAS属于乐观锁。乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。)


CAS的缺点:


1.CPU开销较大

在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。


2.不能保证代码块的原子性

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


3.ABA问题

这是CAS机制最大的问题所在。

什么是ABA问题?怎么解决?我们下一期来详细介绍。



那么问题来了,上面所说的ABA问题是什么?该如何理解呢?


举个例子:

我有两颗变成林俊杰的神奇药丸,还有一颗变成周杰伦的神奇药丸。(药丸的功效是,后面吃的一颗会覆盖前面一颗的效果,可以变化24小时圈粉,变化时长不累加哦)

第一种情况:我如果是依次吃两颗变成林俊杰的药丸的话,在吃周杰伦的药丸,我现在肯定是变身成周杰伦了。

第二种情况:我如果先吃林俊杰的药丸,在吃周杰伦的药丸,在吃林俊杰的药丸,那我变身成的是林俊杰。中间的周杰伦药丸,完全被覆盖了,没有产生效果。

第二个例子:

场景如下: 小强账户有100元
在商场A购买50元商品,把账户余额更新为50
在商城B购买商品,但是付款0.0,然后账户余额更新为 50
小强妈妈给他汇款50元

按照正常场景,此时小强账户应该是余额100元。如果符合CAS机制,会出现什么样的情况呢?

看图,具体操作:


那如何解决上诉情况呢?这里我们引入版本号的概念,在对比内存值与旧预测值,同时增加一个版本号进行对比。






  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值