乐观锁带来的ABA问题的解决

乐观锁: 比较乐观,它认为一般情况下不会发生锁冲突,所以只有在进行更改操作的时候才会对锁冲突进行检查,如果检查出来冲突,就不做任何修改,如果没有冲突才进行修改

乐观锁通常使用CAS(比较并替换)机制来实现,它包含3部分内容
v:内存中的值
A:预期旧值
B :新值

乐观锁(CAS)在JAVA中应用:Unsafe 和 AtomicXXX类

CAS存在ABA问题:
张三进行转账操作(卡里有100元)
1.第一次点击转账按钮: -50元(V=100,A=100 ,B=50)
2,第二次点击转账按钮:-50元(V=100,A=100 ,B=50)
3.发工资了,+50

当第二次点击和发工资两个操作先 第一次转账 一步执行,
卡里的钱经过了 -50 再 +50 的操作,
但是数字经过运算后的结果和之前一致,
这时第一次转账操作开始运行,
单独使用CAS后,只能对比数字的大小是否一致,
无法判断数字是否经过更改
我们原本的意图是,只转账一次就停止,
需要两次转账里成功一次,另一次再进行 V和A的对比时
发现V已经发生变化而取消 另一次转账
所以单纯的使用 一个V已经没用了,我们需要引入另一个参数来辅助判断V的变化

ABA 问题解决方案: AtomicStampedReference
引入版本号,每次操作后让版本号+1,执行时对比 版本号和值,就可以解决ABA问题
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值