Java の基礎となるテクノロジのメモリ モデルと命令の並べ替えを実装する方法

王林
リリース: 2023-11-08 12:25:01
オリジナル
1223 人が閲覧しました

Java の基礎となるテクノロジのメモリ モデルと命令の並べ替えを実装する方法

Java の基礎となるテクノロジのメモリ モデルと命令の並べ替えを実装する方法

概要:
Java の基礎となるテクノロジでは、メモリ モデルと命令の並べ替えが 2 つの重要な概念です。メモリ モデルは共有変数へのアクセス方法を制御しますが、命令の並べ替えはプログラム内で命令が実行される順序に影響します。この記事では、Java メモリ モデルと命令の並べ替えの基本原理を紹介し、具体的なコード例を示します。

  1. メモリ モデル:
    Java メモリ モデル (JMM) は、複数のスレッドが共有データに同時にアクセスするときの動作ルールを定義します。メモリ モデルを使用することで、複数のスレッドにわたるデータの可視性、アトミック性、および順序付けを保証できます。

Java メモリ モデルの主な概念は次のとおりです。

  • メイン メモリ: 共有変数の値を格納する、すべてのスレッドによって共有されるメモリ領域。
  • ワーキングメモリ: 共有変数のコピーを保存する各スレッド専用のメモリ領域。

Java メモリ モデルのルールは次のとおりです。

  • スレッドによる共有変数に対するすべての操作は、メイン メモリ上で直接実行されるのではなく、作業メモリ内で実行される必要があります。
  • スレッドは相互の作業メモリに直接アクセスできず、スレッド間の通信はメイン メモリを通じて完了する必要があります。

コード例:

public class MemoryModelDemo {
    private static volatile boolean flag = false;

    public static void main(String[] args) {
        new Thread(() -> {
            while (!flag) {
                // do something
            }
            System.out.println("Thread 1: flag is true");
        }).start();

        new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            flag = true;
            System.out.println("Thread 2: flag is changed to true");
        }).start();
    }
}
ログイン後にコピー

上記の例では、volatile 修飾子の通信によって変更された共有変数 flag を介してスレッドを実装します。間。このうち、最初のスレッドは flagtrue であるかどうかを継続的にチェックし、true であれば対応する情報を出力し、2 番目のスレッドは 1 を待ちます。 2 番目: flagtrue に設定します。 volatile キーワードを使用することで、flag の可視性が確保されます。つまり、スレッド 1 は、スレッド 2 による flag の変更を時間内に確認できるようになります。

  1. 命令の並べ替え:
    命令の並べ替えは、プログラムのパフォーマンスを向上させるために、コンパイラまたはプロセッサが命令シーケンスを並べ替える最適化手法です。シングルスレッド環境では、命令の並べ替えはプログラムの実行結果に影響を与えません。ただし、マルチスレッド環境では、命令の並べ替えにより命令の実行順序が変わる可能性があり、プログラムの正確さに影響を与えます。

Java における命令の並べ替えは、主に次の 3 つのタイプに分類されます。

  • コンパイラの並べ替え: コンパイラは、コンパイル フェーズ中に命令を並べ替えます。
  • プロセッサの並べ替え: プロセッサは、実行フェーズ中に命令を並べ替えます。
  • メモリの並べ替え: メモリ システムは読み取り/書き込み操作を並べ替えます。

命令の並べ替えによって引き起こされる問題を回避するために、Java では命令の並べ替えを禁止または制限するいくつかのキーワードが提供されています。

  • volatile: 変更された共有変数並べ替えを禁止し、変数の読み取りおよび書き込み操作が確実に順次行われるようにします。
  • synchronized: ロックされたコード ブロックの場合、その内部の命令がロック コードの外部の命令と並べ替えられないことが保証されます。
  • final: 変更された変数が初期化されると、再度変更することはできません。

コード例:

public class ReorderingDemo {
    private static int x = 0;
    private static int y = 0;
    private static volatile boolean flag = false;

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            x = 1;
            flag = true;
        }).start();

        new Thread(() -> {
            if (flag) {
                y = x;
            }
            System.out.println("y = " + y);
        }).start();
    }
}
ログイン後にコピー

上の例では、volatile キーワードを使用して、flag の並べ替えを禁止しています。メインスレッドでは、2 つのサブスレッドを開始します。最初のサブスレッドは、x を 1 に設定し、flagtrue に設定します。 2 番目のサブスレッドは flag をチェックし、それが true の場合、yx の値が割り当てられます。 volatile キーワードを使用することにより、すべてのスレッドの flag に対する読み取りおよび書き込み操作が確実に順次実行されるため、命令の並べ替えによって発生する問題が回避されます。

結論:
この記事の導入部を通じて、Java の基礎となるテクノロジのメモリ モデルと命令の並べ替えの概念と原理を理解し、具体的なコード例を示しました。マルチスレッド プログラミングでは、効率的で正しいプログラムを作成するために、これらの概念と原則を理解することが非常に重要です。同時に、volatile キーワードを使用して複数のスレッド間の通信を実装し、命令の並べ替えを禁止する方法も学びました。

以上がJava の基礎となるテクノロジのメモリ モデルと命令の並べ替えを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート