【发布时间】: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