ホームページ >Java >&#&チュートリアル >Java の基礎となるテクノロジのメモリ モデルと命令の並べ替えを実装する方法
Java の基礎となるテクノロジのメモリ モデルと命令の並べ替えを実装する方法
概要:
Java の基礎となるテクノロジでは、メモリ モデルと命令の並べ替えが 2 つの重要な概念です。メモリ モデルは共有変数へのアクセス方法を制御しますが、命令の並べ替えはプログラム内で命令が実行される順序に影響します。この記事では、Java メモリ モデルと命令の並べ替えの基本原理を紹介し、具体的なコード例を示します。
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
を介してスレッドを実装します。間。このうち、最初のスレッドは flag
が true
であるかどうかを継続的にチェックし、true
であれば対応する情報を出力し、2 番目のスレッドは 1 を待ちます。 2 番目: flag
を true
に設定します。 volatile
キーワードを使用することで、flag
の可視性が確保されます。つまり、スレッド 1 は、スレッド 2 による flag
の変更を時間内に確認できるようになります。
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 に設定し、flag
を true
に設定します。 2 番目のサブスレッドは flag
をチェックし、それが true
の場合、y
に x
の値が割り当てられます。 volatile
キーワードを使用することにより、すべてのスレッドの flag
に対する読み取りおよび書き込み操作が確実に順次実行されるため、命令の並べ替えによって発生する問題が回避されます。
結論:
この記事の導入部を通じて、Java の基礎となるテクノロジのメモリ モデルと命令の並べ替えの概念と原理を理解し、具体的なコード例を示しました。マルチスレッド プログラミングでは、効率的で正しいプログラムを作成するために、これらの概念と原則を理解することが非常に重要です。同時に、volatile
キーワードを使用して複数のスレッド間の通信を実装し、命令の並べ替えを禁止する方法も学びました。
以上がJava の基礎となるテクノロジのメモリ モデルと命令の並べ替えを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。