在使用AtomicInteger时,我发现此API提供了两种方法。
compareAndExchange:
如果引用了当前值,则以原子方式将该值设置为newValue
以作证人值== ExpectedValue,记忆效应为
由VarHandle.compareAndExchange(java.lang.Object...)
指定
compareAndSet:
如果当前newValue
以原子方式将值设置为value == expectedValue
,则具有由以下项指定的存储效果
VarHandle.compareAndSet(java.lang.Object...)
。
我无法理解两者之间的区别,请提供适当的示例帮助。
最佳答案
两种方法具有不同的返回类型。compareAndSet
返回boolean
:
如果成功,则为true。错误返回表示实际值不等于期望值。compareAndExchange
返回一个int
:
见证值,如果成功,它将与期望值相同
即compareAndSet
指示变量的值是否已更新,而compareAndExchange
返回该变量的当前值,从而为您提供更多信息。
如果先前的值是compareAndSet(1,2)
,则2
将原子整数的值设置为1
,并且在这种情况下将返回true
。否则,它将不会设置该值,并且将返回false
。
如果先前的值是compareAndExchange(1,2)
,则2
将原子整数的值设置为1
,并且在这种情况下将返回1
。如果先前的值不是1
,它将不会设置该值,并将返回当前(未更改)的值。