There are two main uses of AtomicInteger
:
-
As an atomic counter (
incrementAndGet()
, etc) that can be used by many threads concurrently -
As a primitive that supports compare-and-swap instruction (
compareAndSet()
) to implement non-blocking algorithms.Here is an example of non-blocking random number generator from Brian Göetz’s 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; } } } ... }
As you can see, it basically works almost the same way as
incrementAndGet()
, but performs arbitrary calculation (calculateNext()
) instead of increment (and processes the result before return).