AtomicInteger在循环中计算

时间:2013-07-18 19:26:40

标签: java atomic

public final int getAndIncrement() {
for (;;) {
    int current = get();
    int next = current + 1;
    if (compareAndSet(current, next))
        return current;
   }
}

我发现increment方法在循环块中起作用。为什么我们不能在没有任何循环的情况下计算结果?什么是它?

4 个答案:

答案 0 :(得分:6)

如果另一个帖子出现并在AtomicIntegerint current = get()之间更改compareAndSet(current, next)的值,则compareAndSet调用将失败。使用循环可确保永远不会发生这种可能性。

答案 1 :(得分:6)

如果另一个线程在当前线程递增compareAndSet

的同时递增或以其他方式修改AtomicInteger,则AtomicInteger的调用可能会返回false
  1. 当前线程调用current = get()
  2. 另一个主题修改AtomicInteger
  3. 当前线程调用next = current + 1
  4. 当前线程调用if(compareAndSet(current, next))
  5. 在第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需要再试一次,第二次只能有一次成功。