ホームページ  >  記事  >  Java  >  なぜ Java では `i ` がアトミックではないのでしょうか?

なぜ Java では `i ` がアトミックではないのでしょうか?

DDD
DDDオリジナル
2024-11-26 14:48:11422ブラウズ

Why Isn't `i  ` Atomic in Java?

Java では i がアトミックではないのはなぜですか?

Java では、i 演算子はアトミックではありません。つまり、2 つのスレッドが同じ変数を同時にインクリメントしようとすると、結果が正しくない可能性があります。これは、i 操作が 3 つの別々のステップで構成されているためです:

  1. 変数の現在の値を読み取る
  2. 値をインクリメントする
  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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。