如果它像compareAndSet一样实现,weakCompareAndSet如何虚假地失败?
(注意,这个问题不是关于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()相同,但“可能会虚假地失败”,而另一个不能。
显然,“弱”和“虚假失败”在某种程度上与“发生之前”的sorting有关,但我仍然非常困惑这两个AtomicInteger(和AtomicLong等)方法: 因为显然他们调用的是完全相同的不安全.compareAndSwapInt方法 。
我特别困惑的是,在Java 1.5中引入了AtomicInteger
,所以在Java内存模型改变之后(所以显然不是在1.4中虚假地失败了,但是其行为改变为“不会在1.5中虚假地失败” ), 。
实现和规范是有区别的…
虽然在特定的实现上,提供不同的实现可能没有多less意义,但是可能在不同硬件上的未来实现可能需要。 这种方法是否在API中占有重要位置是值得商榷的。
此外, weak
方法没有发生 – 在sorting定义之前 。 非weak
版本的行为类似于volatile
字段。
只是玩一下,如果你的问题是
弱点怎么能像真的一样实施呢?
这是答案!
public void doIt() { a(); } /** * May fail spuriously */ public void weakDoIt() { a(); } void a(){ if(Thread.currentThread().getStackTrace()[2].toString().contains("weakDoIt")) System.out.println("I will fail spuriously!"); else System.out.println("I won't fail spuriously!"); }