- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
源码是一样的。
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/
源码是一样的。 public final boolean compareAndSet(V expect, V update) { return unsafe.compareAndSwapObj
Java AtomicInteger 类有一个方法 - boolean weakCompareAndSet(int expect,int update) 它的文档说: May fail spuriou
我是一名优秀的程序员,十分优秀!