gpt4 book ai didi

java - AtomicReference 中的 compareAndSet 和 weakCompareAndSet 有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:18 32 4
gpt4 key购买 nike

源码是一样的。

public final boolean compareAndSet(V expect, V update) {
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}

public final boolean weakCompareAndSet(V expect, V update) {
return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}

有什么意义?

最佳答案

在 x86 上,LOCK CMPXCHG 指令用于实现 CAS。它是原子的,提供(接近)最大排序保证并且不会遭受虚假故障。因此,在 x86 平台上,保证较少的 CAS 没有任何好处。

但在其他平台上,例如 PowerPC 或 ARM(没有 LSE 扩展),CAS 被实现为一系列提供 LL/SC 的指令。行为和内存障碍作为单独的构建 block 。这为您的 CAS 在排序和故障保证方面的强度创造了一些回旋余地。相反,这意味着全强度 CAS 可能是比某些并发算法所需的指令序列成本更高的指令序列。

许多并发算法涉及在 CAS 失败时重试或重新计算操作然后重试的循环。由于 LL/SC 可能会虚假地失败,因此基于它的强大 CAS 实现必须在内部循环。如果代码已经包含外循环,则可以通过将强 CAS 替换为允许虚假失败的弱 CAS 来避免内循环。

所以 weakCAS 的存在是为了在弱序架构上允许更高效的代码。

javadoc 对弱化排序的确切含义含糊不清,因为目前无法用 java 内存模型来表达它。当它与 C++11 内存模型更紧密地对齐时,将来可能会对其进行修改。

JSR-133 Cookbook 的多处理器章节中的表格概述了平台的不同之处。

关于java - AtomicReference 中的 compareAndSet 和 weakCompareAndSet 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36428044/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com