Java 通过其原子类公开 CAS 操作,例如
AtomicInteger.compareAndSet(expected,update)
什么时候expected == update
,这些调用是无操作的还是它们仍然具有易失性读+写的内存一致性效果(就像什么时候一样expected != update
)?
Java 通过其原子类公开 CAS 操作,例如
AtomicInteger.compareAndSet(expected,update)
什么时候expected == update
,这些调用是无操作的还是它们仍然具有易失性读+写的内存一致性效果(就像什么时候一样expected != update
)?
AFAIK 没有检查expected == update
也没有改变行为。如果硬件还没有这样做,这样做可能会增加周期,我怀疑它没有。
在任何情况下,我都不会编写依赖于调用 CAS 的副作用的代码。
如果您认为有可能,您当然可以自己添加支票。
我浏览了本机代码,并且在值相等方面似乎没有任何区别。特别是在这种情况下,因为整数等价不会在引用上这样做。
它将在事件中以相同的内存一致性运行相同的逻辑expected != update
需要注意的是,该字段的位置总是至少有一个 volatile 负载,因此您至少会对支持的 int 字段进行 volatile 读取。