【问题标题】:Does the compareAndSet return value guarantees a "Happens before" relationship?compareAndSet 返回值是否保证“发生在之前”的关系?
【发布时间】:2021-12-24 03:23:41
【问题描述】:

我相信关于这个主题已经问了很多问题,但我想他们都躲开了我。

我的问题出现了,因为我查看了相同代码的变体,其中自旋锁与原子 compareAndSet 相结合,我想重点是确保发生在关系之前。

在循环开始时执行一个.get(),这个ref将作为“期望”,如果在事务结束时该值仍然与开始时相同,则返回。

compareAndSet 的返回唯一用于从循环中返回。

如果 Java 锁应该是自适应的,这意味着它们结合了自旋和上下文切换,那么仅同步主体而不是执行双嵌套自旋锁会不会更方便,因为 compareAndSet 正在执行第二个循环是吗?

似乎原子类可以放置一个带有函数参数的方法来执行自定义事务,而不是强迫人们进行外部循环,缺少这个选项是我一直如此困惑的部分原因compareAndSet 返回,因为返回值似乎具有相同的目的,但我猜不是。

【问题讨论】:

  • compareAndSet 在其中没有循环 - 它以 1:1 的比例映射到许多当前处理器上存在的低级功能(例如在 Intel 处理器上:CMPXCHG)。这个低级功能不支持“自定义事务”——这是更高级别代码的工作。
  • if at the end of the transaction the value is the same ... 让我你可能想看看 StampedLock

标签: java atomic synchronized compare-and-swap spinlock


【解决方案1】:

遵循 compareAndSet 的 javadoc 清楚地表明 JVM 将这些视为与 volatile 相同,我们可以在此处找到许多描述,包括 SO:Java volatile and side-effects

简短回答:是的

【讨论】:

    猜你喜欢
    • 2017-07-06
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多