1. ホーム

[解決済み】AtomicIntegerの実用的な使い方

2022-04-16 23:32:10

質問

AtomicIntegerなどのAtomic変数が同時アクセスを許可していることはなんとなく理解しています。このクラスは一般的にどのような場合に使用されるのでしょうか?

どのように解決するのですか?

の主な用途は2つあります。 AtomicInteger :

  • アトミックカウンターとして( incrementAndGet() 多くのスレッドで同時に使用することができます。

  • をサポートするプリミティブとして コンペア・アンド・スワップ 命令 ( compareAndSet() ) を用いて、ノンブロッキングアルゴリズムを実装しています。

    以下はノンブロッキング乱数生成器の例です。 Brian Göetz著『Java Concurrency In Practice(Java並行処理の実践)』。 :

    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() )の代わりにインクリメントを行う(そして結果をリターン前に処理する)。