Java スレッドの「前に起こる」ルールとは何ですか?

WBOY
リリース: 2023-04-14 19:07:10
転載
1387 人が閲覧しました

Text

happens-before は、共有変数の書き込み操作が他のスレッドの読み取り操作から見えることを規定します。これは、次のことに関係なく、可視性と順序性に関する一連のルールの概要です。前発生ルール。JMM は、スレッドによる共有変数への書き込みが他のスレッドによる共有変数の読み取りに表示されることを保証できません。

ケース 1

前に変数への書き込みスレッドが 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
*/
ログイン後にコピー

ケース 2

スレッドによる volatile 変数の書き込みは、次のスレッドに表示されます。他のスレッドによる後続の変数の読み取り

    volatile static int x;
    new Thread(()->{
     x = 10;
    },"t1").start();

    new Thread(()->{
     System.out.println(x);
    },"t2").start();
/*
运行结果:
10
*/
ログイン後にコピー

ケース 3

スレッドの開始前の変数への書き込みは、スレッドの開始後の変数の読み取りに表示されます。

static int x;
x = 10;
new Thread(()->{
 System.out.println(x);
},"t2").start();
/*
运行结果:
10
*/
ログイン後にコピー

ケース 4

スレッドが終了する前の変数への書き込みが表示されます。書き込み、終了がわかった後に読み取るために他のスレッドに表示されます (t1.isAlive() または t1 を呼び出す他のスレッドなど)。 join() で終了を待ちます)

static int x;
Thread t1 = new Thread(()->{
 x = 10;
},"t1");
t1.start();
t1.join();
System.out.println(x);
/*
运行结果:
10
*/
ログイン後にコピー

ケース 5

スレッド 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
*/
ログイン後にコピー

ケース 6

変数のデフォルト値 (0、false、null) の書き込みは、他のユーザーによる変数の読み取りから見えます。スレッド

    static int a;
    public static void main(String[] args) {
        new Thread(()->{
            System.out.println(a);
        }).start();

    }
/*
运行结果:
0
*/
ログイン後にコピー

ケース 7

は推移的であり、x hb-> y および y hb-> z の場合、次のようになります。

以上がJava スレッドの「前に起こる」ルールとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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