并发系列—CAS之ABA问题

4 篇文章 0 订阅

上篇文章通过自旋锁保证了数据的准确性,现在我们讨论一个问题。

PS:看这个问题前需要确保已经明白自旋锁的执行原理

业务:获取对象名称,根据名称对数据进行相关处理。

如图:

【上图我们发现并发时使用CAS处理业务可能会因多条线程同时操作导致某些业务被重复操作,出现ABA问题】

QA:如何解决CAS的ABA问题?

思路:使用版本号控制(例:mysql的乐观锁)

定义一个字段用于存放版本号version,获取name的时候同时获取version,每个线程成功操作都给version执行+1操作。

基于上图:

获取信息
    threadA:version = 1,name=A
    threadC:version = 1,name=A
threadA操作
    校验
        version是否等于1,name是否等于A
        满足条件
            设置version=2,name等于B
threadB
    获取信息
        version = 2,name=B
    校验
        version是否等于2,name是否等于B
        满足条件
            设置version=3,name等于A
threadC操作
    校验
        version是否等于1,name是否等于A
    不满足
        name等于A但是version=3  ==》被其他线程操作过
             获取对象最新的version与name继续进行业务预处理
        校验
            当前获取的version、name与对象中持有的是否一致
            一致
                将业务处理结果赋值给对象
            不一致
                继续获取对象当前version、name对业务做预处理然后校验原始信息是否一致(此时进入一个循环状态自旋的概念因此而来】,直到能够给对象赋值为止)
    满足条件
        将业务处理结果赋值给对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值