对CAS的理解

首先,CAS全称是compare and swap,翻译过来就是比较与交换。
其次,这是一个无锁算法,基于乐观锁思想,可以实现多线程之间的变量同步,避免出现同步问题。
CAS算法的核心有三个要素,
一个内存地址V的值(假设叫v),
一个是旧的预期值A,
一个即将写入的值B。
算法的过程就是将A与v相比,相等的话就把B写入地址V。
举个栗子
现在有两个线程同时对一个变量a操作,线程A和线程B同时拿到a的值1。
接着假设线程A的操作是a++,也就是他即将把2赋值给a,这时使用CAS算法,线程A用它操作开始时拿到的a的值1去跟现在a的值比较,如果现在的值还是1,意味着没有人在它前面修改a,就自然而然地修改a为2
这时,线程B操作完了,假设B的操作是a–,它准备把0写入a,却发现现在a的值2和它一开始拿到的1不等,它立刻知道自己手速慢了,之前一波操作都是错的,就全部放弃重来一波。
以上
相信细心的同学已经发现了CAS的一个缺点:
也就是经典的ABA问题
以刚才的栗子来讲,线程A一波操作之后重新拿a的值,发现也是1,跟它一开始拿到的值一样,它就准备心安理得的写入,但是a的值真的没有发生变化吗?
a有可能被人改了好几次,然后又改会了1,你能说a没被改过?
好吧,这个问题经过JDK的迭代已经有解决办法了。
还有一个经典的问题:循环开销大(CAS改值不成功该线程一直自闭,疯狂循环,直到改成功为止),这个问题现在也有优化哟。
**最后一个问题:**CAS只对一个共享变量操作有效,多个变量就GG。嗯,看了上面两个,你也能猜到了,它现在也有了解决办法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值