happens-before は、共有変数の書き込み操作が他のスレッドの読み取り操作から見えることを規定します。これは、次のことに関係なく、可視性と順序性に関する一連のルールの概要です。前発生ルール。JMM は、スレッドによる共有変数への書き込みが他のスレッドによる共有変数の読み取りに表示されることを保証できません。
前に変数への書き込みスレッドが m のロックを解除すると、次のスレッドに表示されます。 m にロックされている他のスレッドによる変数の読み取りが表示されます。
static int x; static Object m = new Object(); new Thread(()->{ synchronized(m) { x = 10; } },"t1").start(); new Thread(()->{ synchronized(m) { System.out.println(x); } },"t2").start(); /* 运行结果: 10 */
スレッドによる volatile 変数の書き込みは、次のスレッドに表示されます。他のスレッドによる後続の変数の読み取り
volatile static int x; new Thread(()->{ x = 10; },"t1").start(); new Thread(()->{ System.out.println(x); },"t2").start(); /* 运行结果: 10 */
スレッドの開始前の変数への書き込みは、スレッドの開始後の変数の読み取りに表示されます。
static int x; x = 10; new Thread(()->{ System.out.println(x); },"t2").start(); /* 运行结果: 10 */
スレッドが終了する前の変数への書き込みが表示されます。書き込み、終了がわかった後に読み取るために他のスレッドに表示されます (t1.isAlive() または t1 を呼び出す他のスレッドなど)。 join() で終了を待ちます)
static int x; Thread t1 = new Thread(()->{ x = 10; },"t1"); t1.start(); t1.join(); System.out.println(x); /* 运行结果: 10 */
スレッド t1 t2 を中断する (中断) 前の変数の書き込みは、t2 が中断されたことを認識した後、他のスレッドに表示されます ( t2.interrupted または t2.isInterrupted を介して)
static int x; public static void main(String[] args) { Thread t2 = new Thread(()->{ while(true) { if(Thread.currentThread().isInterrupted()) { System.out.println(x); break; } } },"t2"); t2.start(); new Thread(()->{ sleep(1); x = 10; t2.interrupt(); },"t1").start(); while(!t2.isInterrupted()) { Thread.yield(); } System.out.println(x); } /* 运行结果: 10 */
変数のデフォルト値 (0、false、null) の書き込みは、他のユーザーによる変数の読み取りから見えます。スレッド
static int a; public static void main(String[] args) { new Thread(()->{ System.out.println(a); }).start(); } /* 运行结果: 0 */
は推移的であり、x hb-> y および y hb-> z の場合、次のようになります。
以上がJava スレッドの「前に起こる」ルールとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。