码迷,mamicode.com
首页 > 其他好文 > 详细

AbA问题的产生

时间:2019-11-09 13:45:37      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:10个   例子   记录   活动   修改   包装   debug   一段   开始   

要了解什么是ABA问题,首先我们来通俗的看一下这个例子,一家火锅店为了生意推出了一个特别活动,凡是在五一期间的老用户凡是卡里余额小于20的,赠送20元,但是这种活动每人只可享受一次。然后火锅店的后台程序员小王开始工作了,很简单就用cas技术,先去取用户卡里的余额,然后包装成AtomicInteger,开启10个线程,判断小于20的,一律加20,然后就很开心的交差了。可是过了一段时间,发现账面亏损的厉害,老板起先的预支是2000块,因为店里的会员总共也就100多个,就算每人都符合条件,最多也就2000啊。小王一下就懵逼了,赶紧debug,tail -f一下日志,这不看不知道,一看吓一跳,有个客户被充值了10次!

阐述:

假设有个线程A去判断账户里的钱此时是15,满足条件,直接+20,这时候卡里余额是35。但是此时不巧,正好在连锁店里,这个客人正在消费,又消费了20,此时卡里余额又为15,线程B去执行扫描账户的时候,发现它又小于20,又用过cas给它加了20,这样的话就相当于加了两次,这样循环往复肯定把老板的钱就坑没了!

本质:

ABA问题的根本在于cas在修改变量的时候,无法记录变量的状态,比如是否修改过这个变量,修改的次数。这样就很容易在一个线程将A修改成B时,另一个线程又会把B修改成A,造成与期望不符合的情况。

 

AbA问题的产生

标签:10个   例子   记录   活动   修改   包装   debug   一段   开始   

原文地址:https://www.cnblogs.com/moris5013/p/11824993.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!