0

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

4

2 回答 2

3

请参阅compareAndSet(int expect,int update)的合同:

... False return 表示实际值不等于预期值。

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

于 2018-04-05T13:42:03.667 回答
2

线程可能被另一个原因破坏......我不确定我是否正确地回答了你的问题......

我会说如果没有其他原因是不可能的,
只需看看 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);
于 2018-04-05T13:40:09.640 回答