在使用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,它将不会设置该值,并将返回当前(未更改)的值。

07-24 09:19