(注意,这个问题不是关于CAS,它是关于“可能虚假地失败” Javadoc)。weakCompareAndSet如果像compareAndSet一样实现,它会如何虚假地失败?
从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()真的感到困惑的是‘可能会意外失败’而另一个则不行。
显然,“弱”和“虚假失败”与“发生之前”排序有关,但我仍然非常困惑这两个AtomicInteger(和AtomicLong等)方法:因为显然他们拨打完全相同的unsafe.compareAndSwapInt方法。
我感到特别困惑在AtomicInteger
得到了Java内存模型变化后Java 1.5中引入的,所以(所以它显然不是东西,可以“在1.4意外失败”,但其行为改为“应不会在1.5“中虚假地失败)。
好问题智者 – 2010-03-14 18:39:54
确实很奇怪。这可能是API未来打击,但这是一个奇怪的方式去做。似乎所有'AtomicXYZ'类在'compareAndSet'和'weakCompareAndSet'中做了同样的事情,所以它不像是为了实现一致性。 – skaffman 2010-03-14 18:43:27
参见http://stackoverflow.com/questions/4183202/java-compare-and-swap-semantics-and-performance – assylias 2013-05-13 21:56:44