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