compare and swap ABA 问题和解决方案

CAS ABA 问题图解

compare and swap ABA 问题和解决方案

如上图所示三个线程 T1,T2,T3 更新内存中的值 V。具体执行时刻沿着时间线。

  1. T1T2 同时读取到内存中的值 V,保存到线程私有变量 A 此时 A的值为 100
  2. T1 线程的 A = 100 (也就是当前线程私有保存的 V 的一份拷贝),计算 B = A - 50, 此时比较 A 和 V 相等,将 V 的值更新为 50
  3. T2 被阻塞。
  4. T3 读取到 V = 50,保存在 A 中。计算 B = A + 50 = 100,比较 A 和 V 的值,相等。将 V 的值更新为 100。注意此时内存中的 V 的值经历了从 100->50->100 的过程,这就是所谓的 ABA 问题
  5. T2 接着执行,计算 B = A - 50 = 50。比较 A 和 V 的值,相等。将V 的值更新为 50

解决方案

本质原因:内存中 V 的值经过了改变,又变回了原值。但是没有记录这个信息。
怎么办?
加一个版本号来记录 V 的版本。这就是代价,要表示这个变化过程的代价。

解决 ABA 问题图解

CAS 更新成功条件

  1. V = A
  2. 版本相同
    compare and swap ABA 问题和解决方案
  3. 可以看到 T1 和 T2 读取到的 version 都是 01
  4. T1 执行完成后,更新内存中 V 的值为 50,版本号为 02
  5. T3 执行完成后,更新内存中 V 的值为 100,版本号为 03
  6. T2 读取到的 version 是 01,but 此时内存中的 version 是 03,版本不匹配 T2 更新失败。