【问题标题】:compareandexchange() vs compareandset() of Atomic-Integer原子整数的 compareandexchange() 与 compareandset()
【发布时间】:2020-06-24 04:14:09
【问题描述】:

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

compareAndExchange

如果当前值被引用,则以原子方式将值设置为 newValue to 作为见证值,== expectedValue,记忆效应为 由VarHandle.compareAndExchange(java.lang.Object...)指定

compareAndSet

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

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

【问题讨论】:

    标签: java java-9 atomicinteger


    【解决方案1】:

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

    compareAndSet 返回boolean

    如果成功则为真。 False return表示实际值不等于期望值。

    compareAndExchange 返回一个int

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

    compareAndSet 表示变量的值是否更新,compareAndExchange 返回变量的当前值,提供更多信息。

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

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

    【讨论】:

    • 但它们都使用不同的内存指令——即 COMPARE_AND_EXCHANGE 和 COMPARE_AND_SET 将在结果中产生任何差异
    • @Eran 为什么compareAndExchange​(1,2) 会在之前的值为 1 时返回 1。它不应该返回 当前值,即 2 吗?
    • 基于以下讨论,CAS 可能比 CAE 更快:bugs.openjdk.java.net/browse/JDK-8141640
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多