3

Java 通过其原子类公开 CAS 操作,例如

AtomicInteger.compareAndSet(expected,update)

什么时候expected == update,这些调用是无操作的还是它们仍然具有易失性读+写的内存一致性效果(就像什么时候一样expected != update)?

4

2 回答 2

0

AFAIK 没有检查expected == update也没有改变行为。如果硬件还没有这样做,这样做可能会增加周期,我怀疑它没有。

在任何情况下,我都不会编写依赖于调用 CAS 的副作用的代码。

如果您认为有可能,您当然可以自己添加支票。

于 2012-09-19T13:42:53.300 回答
0

我浏览了本机代码,并且在值相等方面似乎没有任何区别。特别是在这种情况下,因为整数等价不会在引用上这样做。

它将在事件中以相同的内存一致性运行相同的逻辑expected != update

需要注意的是,该字段的位置总是至少有一个 volatile 负载,因此您至少会对支持的 int 字段进行 volatile 读取。

于 2012-09-19T14:51:19.227 回答