gpt4 book ai didi

java - 如果weakCompareAndSet 的实现与compareAndSet 完全一样,它怎么会虚假失败?

转载 作者:IT老高 更新时间:2023-10-28 20:41:37 26 4
gpt4 key购买 nike

(请注意,这个问题不是关于 CAS,而是关于 “可能会虚假失败” Javadoc)。

AtomicInteger 类中这两个方法在 Javadoc 中的唯一区别是 weakCompareAndSet 包含以下注释:“可能错误地失败”.

现在除非我的眼睛被某种咒语欺骗了,否则这两种方法看起来确实是一样的:

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

/* ...
* May fail spuriously.
*/
public final boolean weakCompareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

所以我意识到“五月”并不意味着“必须”,但是我们为什么不开始将它添加到我们的代码库中:

public void doIt() {
a();
}

/**
* May fail spuriously
*/
public void weakDoIt() {
a();
}

我真的很困惑 weakCompareAndSet() 似乎与 compareAndSet() 执行相同但“可能会虚假失败”而另一个则不能t.

显然,“弱”和“虚假失败”在某种程度上与“发生前”排序有关,但我仍然对这两种 AtomicInteger(和 AtomicLong 等)方法感到非常困惑:因为显然他们调用完全相同的 unsafe.compareAndSwapInt 方法

我特别困惑的是 AtomicInteger 是在 Java 1.5 中引入的,所以在 Java 内存模型更改之后(因此它显然不会“在 1.4 中虚假失败”,但其行为更改为 “在 1.5 中不会虚假失败”)。

最佳答案

实现和规范是有区别的……

虽然在特定实现上提供不同的实现可能没有多大意义,但 future 可能在不同硬件上的实现可能需要。这种方法是否在 API 中占有重要地位是值得商榷的。

weak 方法也没有定义 happens-before 顺序。非weak 版本的行为类似于volatile 字段。

关于java - 如果weakCompareAndSet 的实现与compareAndSet 完全一样,它怎么会虚假失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443239/

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