ABA 问题

“自从上次看到 V 的值为 A 以来,这个值是否发生了变化?”在某些算法中,如果 V 的值首先由 A 变成 B,再由 B 变成 A,那么仍然被认为是发生了变化,并需要重新执行算法中的某些步骤。

ABA 问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加 1,那么 A -> B -> A 就会变成 1A -> 2B -> 3A。

从 Java 1.5 开始,JDK 的 Atomic 包里提供了一个类 AtomicStampedReference 来解决 ABA 问题。这个类的 compareAndSet 方法的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

最后更新于