关于CAS的ABA,自旋锁问题记录

本篇是记录在了解CAS时,遇到的几个困惑。

ABA的危害

例如张三挪用公款,并在发现之前还了回来,钱是没少,但张三却已经触犯了发律。

ABA是因为CAS导致的吗?

扯cas有aba问题的说法,类似于:压缩饼干有感冒加重的问题。
cas的本意就是原子地完成比较和写值。cas的比较只能比较目标值是否和期待值相等,并不能比较出目标值是否改变过!这点很难达成共识吗?现在说cas会导致aba问题?
aba问题是cas导致的吗?如果aba在你的场景中是一个问题那么请不要用cas,或者至少不要仅仅依靠cas。
压缩饼干的任务就是能充饥并且便携,你非要指责压缩饼干会导致感冒加重,逻辑错乱。为了解决这个伪问题,他们发明了加感冒药版压缩饼干——AtomicStampedReference。

cas本身不是锁,只是cas很容易用来封装成锁,乐观锁只是一种思想,并不是真的有一种锁是乐观的。有些场景是不封装成锁直接使用cas,例如对AtomicInteger的increase,这就是乐观锁思想的实践,所以AtomicInteger.increase才能被称为无锁实现。

转自:https://www.zhihu.com/question/23281499/answer/676233106

cas和自旋锁的关系

这个博主写的完全和我想的问题一样,全文搬过来了。

问题:
CAS是 compare and swap ,就是一个比较工作内存和主内存的值是否相同,相同的话,就用新值来替换这么一个操作。
但是,为什么好多地方都说这是自旋呢?
我理解比较一次的话,成功就返回true了,失败,那么就返回false。如果没有for循环的话,这就是一次操作啊,它本身不会去重试吧?只有在for(;;)死循环里边,才可以重试啊,很多底层都是这样做的。
所以,仅仅是CAS的话,就是一次操作,为什么叫做自旋呢。自旋的概念到底就是说是CAS,还是说有for循环的才叫CAS。真的很误导人啊。
下面贴一下 CAS的源码注释:
在这里插入图片描述
这里边,没有任何词语说,它本身有自动重试这个机制吧?

回答1:
你的理解大体上是没问题的,稍微还有一点不完美。
自旋和cas不是一回事儿,只是再cas的时候可以利用自旋机制来不断重试
自旋是一种锁优化机制,所以锁优化中会有『自旋锁』的概念(线程空转重试获取锁),自旋不一定是用在cas场景,其他锁场景也是能用的(比如互斥锁)
cas是一种乐观锁机制,cas可以不用自旋机制,失败也可以直接返回false。只是一般应用场景下,cas都会带有重试机制(while和for实现空转,不断尝试)

回答2:
是两个概念,你的理解没错,只不过经常将cas和轮询结合使用,实现线程安全的,不使用锁的读写操作。
举个例子:
在这里插入图片描述
lock_是一个原子变量,compare_exchange_weak是c++的cas实现方式之一,这里就结合了cas和while轮询做线程安全的自旋锁。

转自链接:https://blog.csdn.net/fengyuyeguirenenen/article/details/122554553?spm=1001.2014.3001.5506

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值