为什么在 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.
以下代码在没有竞争条件的情况下工作
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.