javadoc是这样解释的:weakCompareAndSet
如果当前值 == 预期值,则以原子方式将值设置为给定的更新值。
可能会虚假地失败,并且不提供排序保证,因此很少是比较AndSet的合适替代方案。
简而言之,javadoc是说该版本是(或曾经是)提供“较弱”保证的版本。weak
现在,正如您所观察到的,这两种方法的当前实现是相同的。从Java 6到Java 8(至少)都是如此,基于Grepcode站点上的源代码。
因此,我推测这两种方法的实现是:
最后一种解释不太可能。如果两个方法最初实现相同,则将它们重新实现为不同的方法可能会破坏预先存在的代码。这是一个坏主意,即使对于.Unsafe
@assylias / @ Stefan Gobel评论了另一种解释。基本上,我们在源代码中看到的“相同代码”实际上可能被JIT编译器重写,为这两种方法提供不同的机器代码。
这当然是合理的。JIT 编译器确实为某些(非本机)方法调用生成了特殊情况的代码:所谓的“内部函数”。
在 Java 9 中,该方法被标记为已弃用。源代码中的解释是:weakCompareAndSet
此方法具有明显的记忆效应,但方法名称暗示了易失性记忆效应(请参阅 {@link #compareAndExchange} 和 {@link #compareAndSet} 等方法)。为了避免混淆简单或易失性的记忆效应,建议改用方法 {@link #weakCompareAndSetPlain}。
另一方面,我们现在看到它现在的实现方式与 / 不同:compareAndSet
weakCompareAndSet
weakCompareAndSetPlain
public final boolean compareAndSet(V expectedValue, V newValue) {
return VALUE.compareAndSet(this, expectedValue, newValue);
}
public final boolean weakCompareAndSet(V expectedValue, V newValue) {
return VALUE.weakCompareAndSetPlain(this, expectedValue, newValue);
}
其中 声明为 .上面使用的方法被标记为固有的候选者。VALUE
java.lang.invoke.VarHandle
VarHandle
native