为什么在 Java 中可以在没有竞争条件的情况下并发更新原子变量?

Why is it possible to update atomic variables concurrently without race condition in Java?

以下代码在没有竞争条件的情况下工作

AtomicInteger atomicInt = new AtomicInteger(0);

ExecutorService executor = Executors.newFixedThreadPool(20);

IntStream.range(0, 1000)
    .forEach(i -> executor.submit(atomicInt::incrementAndGet));

下面是incrementAndGet

的实现
public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

我们可以看到 current 未同步或锁定,在一个线程获得 current 后,另一个线程可能已经更新了 current

但原子 class 似乎以某种方式避免了竞争条件。

谁能指出我的错误?

当且仅当第一个参数等于 AtomicInteger 的当前值时,

compareAndSet 设置值(并且 returns 为真)。

也就是说,如果另一个线程已经更改了该值,则 current 将不等于当前值,并且循环将再次 运行。

来自compareAndSet(int expect, int update)documentation

Atomically sets the value to the given updated value if the current value == the expected value.