以下代码在没有竞争条件的情况下工作
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==期望值。