为什么在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

但原子类似乎避免了种族条件的一些方式。

有人能指出我的错误吗?

compareAndSet设置值(并返回true(,当且仅当第一个参数等于AtomicInteger的当前值

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

来自compareAndSet(int expect, int update):的文档

如果当前value==期望值。

相关内容

  • 没有找到相关文章

最新更新