Java では、i 演算子はアトミックではありません。つまり、2 つのスレッドが同じ変数を同時にインクリメントしようとすると、結果が正しくない可能性があります。これは、i 操作が 3 つの別々のステップで構成されているためです:
2 つのスレッドがこれらのステップを同時に実行すると、一方のスレッドが他方のスレッドより先に値を読み取る可能性があります。スレッドがそれを増加させました。これにより、データが破損する可能性があります。
たとえば、次のコードを考えてみましょう:
class Test { private static int total = 0; public static void main(String[] args) { Thread thread1 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100000; i++) { total++; } } }); thread1.start(); thread2.start(); thread1.join(); thread2.join(); System.out.println("Total: " + total); } }
このコードを実行すると、200000 が出力されると予想されますが、実際にはそれより低い値が出力される可能性があります。 i 演算子の非アトミックな性質による値です。
マルチスレッド コードが共有変数にアトミックにアクセスできるようにするには、ロックやアトミック変数などの同期メカニズムを使用するために必要です。 synchronized キーワードはコード ブロックへのアクセスを同期するために使用でき、AtomicInteger クラスはアトミックな整数型を提供します。
以上がなぜ Java では `i ` がアトミックではないのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。