为什么Java AtomicInteger中的getAndIncrement()中存在循环?

Lil*_*ily 3 java multithreading

getAndIncrement的源代码是:

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

我不明白为什么有一个循环.如果其他一些线程更改了值,那么它怎么可能是原子的呢?

假设值为5,然后我调用getAndIncrement(),我们期望它为6,但同时其他一些线程已将值更改为6,然后getAndIncrement()将使值为7,这是不可预期的.

我哪里错了?

ysh*_*vit 7

循环将继续下去,直到它设法做get()+1,而compareAndSet没有任何其他线程获得在compareAndSet第一.如果另一个线程确实获得了compareAndSet,则该线程的compareAndSet将失败,并且循环将重试.

最终结果是每次调用getAndIncrement()都会导致该值的一个增量.如果该值最初为5,并且两个线程调用getAndIncrement(),则一个将返回6而另一个将返回7.

换句话说:其中一个似乎完全发生在另一个之后,这就是"原子"的意思.

  • 好东西.需要指出的另一个重要的事情是循环的整个点是避免"同步"块.这是试图更新共享字段_without_必须支付锁的开销. (2认同)