所有线程都可以compareAndSet失败吗?

时间:2018-04-05 13:32:12

标签: java multithreading compare-and-swap atomicinteger

我使用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
  4. 是否记录在案?它是平台依赖的吗? x86-64怎么样?

2 个答案:

答案 0 :(得分:3)

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

  

...错误返回表示实际值不等于预期值。

因此,如果暗示,如果这些线程正在访问该值并且您已确认 当前位于if ($request.status !== undefined && $request.status === 0) { return; } ,那么仅限所有失败的方法是1处的。 QED。

答案 1 :(得分: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);