CAS的ABA有没有必要解决?
王猴卖瓜
共 523字,需浏览 2分钟
·
2021-03-14 12:39
什么是ABA问题?
ABA示例:
1).在多线程的环境中,线程a从共享的地址X中读取到了对象A。
2).在线程a准备对地址X进行更新之前,线程a挂起。线程b将地址X中的值修改为了B。
3).接着线程b或者线程c将地址X中的值又修改回了A。
4).线程a恢复,接着对地址X执行CAS,发现X中存储的还是对象A,对象匹配,CAS成功。ABA问题需不需要解决?
如果依赖中间变化的状态,需要解决。如果不是依赖中间变化的状态,对业务结果无影响。解决ABA问题。
ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A。
从Java1.5开始JDK的atomic包里提供了AtomicStampedReference和AtomicMarkableReference类来解决ABA问题。
评论