AtomicStampedReference 的 CAS 操作,这么理解对吗
資深大佬 : amiwrong123 4
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))); }
就是上面的((newReference == current.reference && newStamp == current.stamp) ||这里,首先我觉得,可能调用这个函数的时候,参数 expectedReference 就是 newReference 一样的,同样,expectedStamp 和 newStamp 也一样的。但是这样做 CAS 操作,不就相当于没有进行设置吗,反正都是一样的。
然后,我又想到,难道这里还有另一种情况。调用这个函数时,参数 expectedReference 和 newReference 是不一样的,expectedStamp 和 newStamp 也不一样的。但线程执行到expectedStamp == current.stamp就切换出去了,然后切换回来了,current 的两个成员刚刚被别的线程修改了,然后刚好通过了(newReference == current.reference && newStamp == current.stamp)的判断,也就不用执行 casPair 了。
各位大佬,上面这两种情况,我想得对吗?
大佬有話說 (2)