小编典典

AtomicInteger 的实际用途

all

我有点理解 AtomicInteger 和其他 Atomic 变量允许并发访问。但是,通常在什么情况下使用此类?


阅读 110

收藏
2022-05-13

共1个答案

小编典典

有两个主要用途AtomicInteger

  • 作为incrementAndGet()可以被多个线程同时使用的原子计数器(等)

  • 作为支持比较和交换指令 ( 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())
而不是增量(并在返回之前处理结果)。

2022-05-13