Java 当预期==更新时,比较数据集内存效果

Java 当预期==更新时,比较数据集内存效果,java,concurrency,compare-and-swap,Java,Concurrency,Compare And Swap,Java通过其原子类公开CAS操作,例如 AtomicInteger.compareAndSet(预期,更新) 当expected==update时,这些调用是不可操作的,还是它们仍然具有易失性读写的内存一致性影响(就像expected!=update时的情况一样)?AFAIK没有检查expected==update并且没有行为变化。如果硬件没有这样做,那么这样做可能会增加周期,我怀疑硬件没有这样做 无论如何,我都不会编写依赖于调用CAS的副作用的代码 当然,如果您认为可能的话,您可以自己添加检

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

AtomicInteger.compareAndSet(预期,更新)


expected==update
时,这些调用是不可操作的,还是它们仍然具有易失性读写的内存一致性影响(就像
expected!=update
时的情况一样)?

AFAIK没有检查
expected==update
并且没有行为变化。如果硬件没有这样做,那么这样做可能会增加周期,我怀疑硬件没有这样做

无论如何,我都不会编写依赖于调用CAS的副作用的代码


当然,如果您认为可能的话,您可以自己添加检查。

我查看了本机代码,在值相等的情况下似乎没有任何差异。特别是在这种情况下,因为整数等价对引用不起作用

在事件
expected!=更新


需要注意的是,字段位置上始终至少会有一个可变负载,因此您至少会有一个对backing int字段的可变读取。

FYI:我已经删除了我的答案。我误读了代码,不再确定
compareAndSet(…)
是否真的对底层字段进行了
volatile
读取。我不能完全解析第一段。和什么不同?你能换个说法吗?还是我今天反应太慢了?:-)@格雷:对不起!读起来确实有点混乱。如果预期值和更新值相等,则操作没有差异。这意味着它将对指向内存中不同位置的int值执行相同的比较和交换函数。最后,它仍然会交换这些值,如果它们不相等,这些值将具有相同的内存一致性。你能编辑你的帖子@John,让后代更清楚吗?我仍然不太理解“特别是在这种情况下,因为整数等价在引用上不这样做”。