public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
我发现increment方法在循环块中起作用。为什么我们不能在没有任何循环的情况下计算结果?什么是它?
答案 0 :(得分:6)
如果另一个帖子出现并在AtomicInteger
和int current = get()
之间更改compareAndSet(current, next)
的值,则compareAndSet
调用将失败。使用循环可确保永远不会发生这种可能性。
答案 1 :(得分:6)
如果另一个线程在当前线程递增compareAndSet
AtomicInteger
,则AtomicInteger
的调用可能会返回false
current = get()
AtomicInteger
next = current + 1
if(compareAndSet(current, next))
在第4步,对compareAndSet
的调用将返回false并保持AtomicInteger
不变,因为current
将与AtomicInteger
的当前值不匹配(由于另一个线程在步骤2)修改了它;因此该方法循环并再次尝试
答案 2 :(得分:1)
如果另一个线程正在更新,compareAndSet可能会失败。 for(;;)有点奇怪,我会去的(真的)。
这称为乐观锁定。
答案 3 :(得分:1)
考虑你有三个线程T1,T2,T3正在运行
T1: int current = get(); == 0
T2: int current = get(); == 0
T3: int current = get(); == 0
T3: int next = current + 1;
T1: int next = current + 1;
T2: int next = current + 1;
T2: if (compareAndSet(current, next)) // true
T2: return current;
T3: if (compareAndSet(current, next)) // false
T1: if (compareAndSet(current, next)) // false
T1和T3需要再试一次,第二次只能有一次成功。