CAS虽然高效的Implementation了原子性操作,但是也存在一些缺点,主要表现在以下三个方面。

什么是ABA问题

比如:

Thread1从主存中读取值A,另一个Thread2也从主存中读取值A,此时Thread2将主存值修改成了B,然后Thread2又将主存值修改成了A,这时候Thread1进行CAS操作发现内存中仍然是A,然后Thread1操作成功,这是不正确的。

如何解决ABA问题

通过AtomicStampedReference的compareAndSetMethod进行处理,这里的compareAndSet比一般的多了一个stamp的比较。

Source Code如下:

    public boolean compareAndSet(V   expectedReference,
                                 V   newReference,
                                 int expectedStamp,
                                 int newStamp) {
        Pair<V> current = pair;
        return
            expectedReference == current.reference &&
            expectedStamp == current.stamp &&
            ((newReference == current.reference &&
              newStamp == current.stamp) ||
             casPair(current, Pair.of(newReference, newStamp)));
    }

多了一个stamp的比较,stamp是每次更新来维护的。