CAS和ABA

https://zhuanlan.zhihu.com/p/400817892

CAS(Compare & Set/Compare & Swap)

CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,类似于乐观锁,在提交操作时检查是否一致
在操作之前会记录预期值,操作时比较预期值和当前值,两者一致则修改。

  • CAS操作包含三个操作数——内存位置(V)、预期原值(A)、新值(B)。
  • 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。
    否则,处理器不做任何操作。
  • 无论哪种情况,它都会在CAS指令之前返回该位置的值。
  • CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。

操作

  • 比较 A 与 V 是否相等
  • 如果比较相等,将 B 写入 V
  • 返回操作是否成功

CAS算法原理描述

  • 在对变量进行计算之前(如 ++ 操作),首先读取原变量值,称为 旧的预期值 A
  • 然后在更新之前再获取当前内存中的值,称为 当前内存值 V
  • 如果 A==V 则说明变量从未被其他线程修改过,此时将会写入新值 B
    如果 A!=V 则说明变量已经被其他线程修改过,当前线程应当什么也不做。

CAS的ABA问题

  • 进程P1在共享变量中读到值为A
  • P1被抢占了,进程P2执行
  • P2把共享变量里的值从A改成了B,再改回到A,此时被P1抢占。
  • P1回来看到共享变量里的值没有被改变,于是继续执行。

ABA解决方法

在compare阶段不仅要比较期望值A和地址V中的实际值,还要比较变量的版本号是否一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值