我有点理解 AtomicInteger 和其他 Atomic 变量允许并发访问。但是,通常在什么情况下使用此类?
有两个主要用途AtomicInteger:
AtomicInteger
作为incrementAndGet()可以被多个线程同时使用的原子计数器(等)
incrementAndGet()
作为支持比较和交换指令 ( compareAndSet()) 以实现非阻塞算法的原语。
compareAndSet()
这是来自Brian Getz 的 Java Concurrency InPractice的非阻塞随机数生成器示例:
public class AtomicPseudoRandom extends PseudoRandom { private AtomicInteger seed; AtomicPseudoRandom(int seed) { this.seed = new AtomicInteger(seed); } public int nextInt(int n) { while (true) { int s = seed.get(); int nextSeed = calculateNext(s); if (seed.compareAndSet(s, nextSeed)) { int remainder = s % n; return remainder > 0 ? remainder : remainder + n; } } } ... }
如您所见,它的工作方式与 基本相同incrementAndGet(),但执行的是任意计算 ( calculateNext()) 而不是增量(并在返回之前处理结果)。
calculateNext()