解决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是每次更新来维护的。
评论 (0)