CAS算法的实现逻辑的理解

CAS: Compare and Swap,即比较再交换。

乐观锁和悲观锁

传统的锁机制,例如Java的synchronlzed关键字他代表了Java 中悲观锁技术,保证了某一时刻仅有一个线程能访问同步代码方法。synchronlzed 能够很好地工作,却有着(相对)比较大的性能开销。

乐观锁(相对悲观锁)对性能会有很大的帮助
他的核心思想是:你寄希望于在没有冲突的情况下完成一次更新操作,使用乐观锁技术更新时会进行“冲突检测"来判断是否有其他的线程干扰,若是(有其他线程干扰)则视本次更新操作失败,一般会进行重试。
Compare and Swap就是典型的乐观锁技术。

CAS算法理解

CAS指令在Intel CPU上称为CMPXCHG指令,它的作用是将指定内存地址的内容与所给的某个值相比,如果相等,则将其内容替换为指令中提供的新值,如果不相等,则更新失败。这比较并交换的操作是原子的,不可以被中断。初一看,CAS也包含了读取、比较(这也是种操作)和写入这三个操作,和i++并没有太大区别,的确在操作上没有区别,但CAS是通过硬件命令保证了原子性,而i++没有,且硬件级别的原子性比1++这样高级语言的软件级别的运行速度要快地多。虽然CAS也包含了多个操作,但其的运算是固定的(就是个比较),这样的锁定性能开销很小。

简单的来说,CAS有3个操作数,内存值C,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值C相同时,将内存值C修改为B,否则返回C。

示例

在这里插入图片描述例如 t1, t2线程是同时更新同变量56的值,因为t1和2线程是同时去访问同一变量值56的,所以他们会把主内存的值完全拷贝一份到自己的工作内存空间, 所以和2线程的预期值都为56.
假设t1在与t2线程竞争中,线程t1竞争到了,能去更新变量的值,t2线程没争到。
**注意:**失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次发起尝试

之后t1线程去更新变量值改为57,然后写到内存中。
此时对于t2来讲,它会检测到(使用了Volatile),内存值变为了57,与预期值56不一致, 就不能把它修改的值写回主内存就会判定就操作失败了(想改的值不再是原来的值,因为很明显,有其它操作先改变了这个值),就会再次会把主内存更新后的值完全拷贝一份到自己的工作内存空间,重新的获取CPU的时间,进行自增操作。

总结CAS的核心逻辑:就是指当C和A两者进行比较时,如果相等,则证明共享数据没有被修改,替换成新值,然后继续往下运行;如果不相等,说明共享数据已经被修改,放弃已经所做的操作,然后重新执行刚才的操作。这样子,就能保证操作的原子性了。

注:以上为个人学习总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君安否

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值