CAS和ABA问题

CAS(比较与交换)--乐观锁

在线程开始时读取这些多线程共享的数据毛病将其保存到当前进程的副本中,我们称为旧值(old value),watch就是这样的一个功能。在执行更新前,比较当前线程副本保存的旧值和当前线程共享的值是否一致,如果不一致,那么该数据已经被其他线程操作过,此次更新失败。为了保持一致,线程就不去更新任何值,而将事物回滚;否则认为他没有被其他线程操作过,执行对应的业务逻辑,exec命令就是执行“类似”这样的一个功能。

ABA问题,ABA问题来自于CAS原理的一个设计缺陷。

 

时间顺序线程1线程2说明
T1X=A-线程1加入监控X
T2复杂运算开始修改X=B线程2修改X,此时为B
T3处理简单业务-
T4修改线程2修改X,此时变回A
T5结束线程2线程2结束
T6检测X=A,验证通过,提交事务-CAS原理检测通过,因为和旧值保持一致

所以,只是单独的旧值,还不够,还要加入其他的方法。比如hibernate对缓存的持久对象PO加入字段version值,每操作一次PO,version= version+1,这样采用CAS原理检测version,就能避免ABA问题。

 

 

来源:《JavaEE 互联网轻量级框架整合开发》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值