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