我正在使用AtomicInteger比较并设置同步状态。就这个

private final AtomicInteger state = new AtomicInteger(1);

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


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


state = 1
两个或更多个线程试图将状态compareAndSet更改为2
2.处的所有线程均失败,状态保持为1


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

最佳答案

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


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


因此,暗含的是,如果只有这些线程正在访问该值,并且您已确认该值当前位于1处,则所有失败的唯一方法是如果该值不在1处。 QED。

07-24 14:00