(注意,這個問題不是關於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