【发布时间】:2015-12-14 13:20:36
【问题描述】:
AtomicInteger 使用两个概念:CAS 和volatile 变量。
使用volatile 变量可确保当前值对所有线程可见并且不会被缓存。
但我对 CAS(compare AND set) 的概念感到困惑,如下所述:
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
我的问题是whatif(compareAndSet(current, next) 返回false?值不会更新吗?
在这种情况下,当线程执行以下情况时会发生什么:
private AtomicInteger count = new AtomicInteger();
count.incrementAndGet();
【问题讨论】:
-
循环一直存在,直到下一个值已成功更新,但由于 java 8+ 你可以简单地调用 getAndAdd(1),NB 只需要在这里传递 1 的增量。不再需要循环,一切都由 JDK 照顾。 docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/…
标签: java multithreading concurrency volatile