CAS ABA 问题图解

如上图所示三个线程 T1,T2,T3 更新内存中的值 V。具体执行时刻沿着时间线。
T1,T2同时读取到内存中的值V,保存到线程私有变量 A此时A的值为100。T1线程的A = 100(也就是当前线程私有保存的 V 的一份拷贝),计算B = A - 50, 此时比较A 和 V相等,将V的值更新为50。T2被阻塞。T3读取到V = 50,保存在A中。计算B = A + 50 = 100,比较A 和 V的值,相等。将V的值更新为100。注意此时内存中的V的值经历了从100->50->100的过程,这就是所谓的 ABA 问题。T2接着执行,计算B = A - 50 = 50。比较A 和 V的值,相等。将V的值更新为50。
解决方案
本质原因:内存中 V 的值经过了改变,又变回了原值。但是没有记录这个变化过程。
怎么办?
加一个版本号来记录 V 的版本。这就是代价,要表示这个变化过程的代价。
解决 ABA 问题图解
CAS 更新成功条件
- V = A
- 版本相同

- 可以看到
T1 和 T2读取到的 version 都是01。 T1执行完成后,更新内存中V的值为50,版本号为02。T3执行完成后,更新内存中V的值为100,版本号为03。T2读取到的 version 是01,but 此时内存中的 version 是03,版本不匹配 T2 更新失败。
本文通过图解详细解析了CASABA问题,即并发场景下内存值V经历从100到50再回到100的过程,导致T2线程更新失败。介绍了使用版本号记录V的变化过程,解决ABA问题的有效方案。
1316

被折叠的 条评论
为什么被折叠?



