关于解决CAS的ABA问题,jdk中提供了java.util.concurrent.atomic.AtomicStampedReference
但在源码中发现,仍然有问题,请赐教
public boolean compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp) { Pair<V> current = pair;//此处已赋值到局部变量,如果在此时外部已经把pair改了,不就是compare的不是现有的值了吗?这是个问题吗? return expectedReference == current.reference && expectedStamp == current.stamp && ((newReference == current.reference && newStamp == current.stamp) || casPair(current, Pair.of(newReference, newStamp))); }
同意你的观点,但你怎么去改当前AtomicStampedReference这个实例的pair字段?别告诉我你去反射改,那样属于自讨苦吃。别告诉我你去改pair对象,反射就不说了,那个大大的final也不会让你过去。
感谢回复,犯了个小错误,这个方法里是比较pairOffset这个位置的值,current是临时变量一点问题也没有。
private boolean casPair(Pair<V> cmp, Pair<V> val) {
return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
}