首页新闻找找看学习计划

AtomicStampedReference疑问

0
[已解决问题] 解决于 2016-12-13 21:16

关于解决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)));
    }
番茄瓜园的主页 番茄瓜园 | 菜鸟二级 | 园豆:202
提问于:2016-12-13 15:45
< >
分享
最佳答案
0

同意你的观点,但你怎么去改当前AtomicStampedReference这个实例的pair字段?别告诉我你去反射改,那样属于自讨苦吃。别告诉我你去改pair对象,反射就不说了,那个大大的final也不会让你过去。

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10374 | 2016-12-13 15:57

感谢回复,犯了个小错误,这个方法里是比较pairOffset这个位置的值,current是临时变量一点问题也没有。

private boolean casPair(Pair<V> cmp, Pair<V> val) {
return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
}

番茄瓜园 | 园豆:202 (菜鸟二级) | 2016-12-13 21:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册