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
}
}
问题是是否可能出现以下情况:
state = 1
- 两个或多个线程试图
compareAndSet
状态到2
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 所有失败的方法是 NOT 在 1
。 QED.
我正在使用 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
怎么样?
线程可能会被其他原因破坏...我不确定我是否正确回答了您的问题...
我会说如果没有其他原因是不可能的,
看看 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 所有失败的方法是 NOT 在 1
。 QED.