AtomicStampedReference解决CAS中ABA问题

admin
2022-04-20 / 0 评论 / 117 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年04月20日,已超过707天没有更新,若内容或图片失效,请留言反馈。

解决CAS的ABA问题

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

什么是ABA问题

比如:

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

如何解决ABA问题

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

源码如下:

    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是每次更新来维护的。

3

评论 (0)

取消