compareAndSet 能否对所有线程都失败?

Can compareAndSet fail for all threads?

我正在使用 AtomicInteger 来比较和设置同步状态。在这里

private final AtomicInteger state = new AtomicInteger(1);

public void tryDo(){
    if(state.compareAndSet(1, 2)){
        //do some usefule
    }
}

问题是是否可能出现以下情况:

  1. state = 1
  2. 两个或多个线程试图compareAndSet状态到2
  3. 2. 处的所有线程都失败,状态保持 1

有记录吗?它是否依赖于平台? x86-64怎么样?

线程可能会被其他原因破坏...我不确定我是否正确回答了您的问题...

我会说如果没有其他原因是不可能的,
看看 AtomicInteger impl:

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

    public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

查看 compareAndSet(int expect,int update) 的合同:

... False return indicates that the actual value was not equal to the expected value.

因此,暗示如果 只有 这些线程正在访问该值,并且您已确认它 目前在 1 那么 ONLY 所有失败的方法是 NOT1。 QED.