原子整数的compareandexchange()与compareandset()

Jok*_*ker 7 java atomic compare-and-swap atomicinteger java-9

在研究 AtomicInteger 时,我发现这个 API 提供了两种方法。

比较和交换

如果当前值(称为见证值)==预期值,则以原子方式将该值设置为 newValue,并具有由以下指定的记忆效应VarHandle.compareAndExchange(java.lang.Object...)

比较并设置

以原子方式将该值设置为newValue当前值value == expectedValue,并具有由 指定的记忆效应 VarHandle.compareAndSet(java.lang.Object...)

我无法理解两者之间的区别,请帮助提供合适的例子。

Era*_*ran 12

这两个方法有不同的返回类型。

\n\n

compareAndSet返回boolean

\n\n
\n

如果成功则为 true。返回 False 表示实际值不等于期望值。

\n
\n\n

compareAndExchange返回一个int

\n\n
\n

见证值,如果成功则与期望值相同

\n
\n\n

iecompareAndSet表示变量的值是否被更新,而compareAndExchange返回变量的当前值,这为您提供了更多信息。

\n\n

compareAndSet(1,2)2如果先前的值为,则将原子整数的值设置为1,并且在这种情况下返回true。否则,它不会设置该值,并且会返回false

\n\n

compareAndExchange\xe2\x80\x8b(1,2)2如果先前的值为,则将原子整数的值设置为1,并且在这种情况下返回1。如果先前的值不是1,则不会设置该值,并将返回当前(未更改的)值。

\n

  • 但它们都使用不同的内存指令 - 即 COMPARE_AND_EXCHANGE 和 COMPARE_AND_SET 会对结果产生任何影响 (2认同)