面接連環砲シリーズ(十二):Atomiclntegerの使用シーンについて

1333 ワード

  • Atomiclntegerの使用シーンAtomicIntegerは、2つのスレッドが同じ整数を加算するなど、同時に使用する場合に適した原子操作を提供します.
  • なぜAtomiclntegerはスレッドが安全なのか、原理は何ですかAtomicIntegerはintタイプのパッケージであり、原子的なアクセスと更新操作を提供し、その原子的な操作の実現はCAS(compare-and-swap)技術に基づいています.CASは一連の命令として表現され、CASを利用していくつかの更新操作をしようとすると、まず現在の数値を比較し、数値が変化していない場合は、他のスレッドが同時修正されていないことを意味し、更新に成功します.数値が変更されると、異なる選択が発生する可能性があります.再試行するか、成功するかどうかを返します.いわゆる「楽観ロック」だ.
  • AtomiclntegerのCASメカニズムでは、ABAの問題が発生します.オブジェクトを操作し、オブジェクトを取得した後、CAS操作を実行する前に、他のスレッドによって修正され、元のオブジェクト値に変更されます.CASは他のスレッドの修正を無視し、CASオブジェクトの修正に成功します.
  • 変数をvolatileで修飾してはいけませんかvolatileは変数を使用するたびに、各スレッドのワークメモリではなく、ホストメモリから取得させ、スレッドは現在のvolatile変数の最新値を得ることができます.volatileは同時の正確性を保証しないで、volatile変数に理想的なスレッドの安全を提供するには、1対の変数の書き込み操作が現在の値に依存しないという2つの条件を同時に満たさなければならない.2この変数は、他の変数を有する不変式に含まれていない.サンプルコードは次のとおりです:
  • volatile boolean shutdown;  
      
    public void shutdown() {   
        shutdown = true;   
    }  
      
    public void doWork() {   
        while (!shutdown) {   
            // do stuff  
        }  
    }

    shutdownフラグがfalseからtrueに変換され、プログラムが停止します.ステータスフラグは、プログラム内の他のステータスに依存しません.ここではvolatileを使用するのに適しています.

    参考(一部抜粋された文字の著作権は原作者に属する):


    https://blog.csdn.net/lishentao_1122/article/details/88853915 https://www.cnblogs.com/zyrblog/p/9864932.html https://www.cnblogs.com/ouyxy/p/7242563.html