一尘不染

Java AtomicInteger的实际用途

java

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


阅读 552

收藏
2020-03-08

共1个答案

一尘不染

有两个主要用途AtomicInteger

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

作为支持比较和交换指令(compareAndSet())来实现非阻塞算法的原语。

这是BrianGöetz的Java Concurrency In Practice中的非阻塞随机数生成器的示例:

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())而不是增量(并在返回之前处理结果)。

2020-03-08