Heim  >  Artikel  >  Java  >  Was ist die „Passiert vorher“-Regel für Java-Threads?

Was ist die „Passiert vorher“-Regel für Java-Threads?

WBOY
WBOYnach vorne
2023-04-14 19:07:101374Durchsuche

Text

Happens-Before legt fest, dass Schreibvorgänge auf gemeinsam genutzte Variablen für Lesevorgänge durch andere Threads sichtbar sind. Es handelt sich um eine Zusammenfassung einer Reihe von Regeln für Sichtbarkeit und Reihenfolge. Unabhängig von den folgenden Happens-Before-Regeln kann JMM nicht garantieren, dass a Das Schreiben eines Threads in eine gemeinsam genutzte Variable ist für das Lesen der gemeinsam genutzten Variablen durch andere Threads sichtbar.

Fall 1

Das Schreiben in die Variable, bevor der Thread m entsperrt, ist für das Lesen der Variablen durch andere Threads sichtbar, die m anschließend sperren

    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
*/

Fall 2

Das Schreiben der flüchtigen Variablen durch den Thread ist für das nachfolgende Lesen der Variablen durch andere Threads sichtbar.

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

    new Thread(()->{
     System.out.println(x);
    },"t2").start();
/*
运行结果:
10
*/

Fall 3

Das Schreiben der Variablen vor dem Thread-Start ist für den sichtbar Lesen der Variablen nach dem Start des Threads

static int x;
x = 10;
new Thread(()->{
 System.out.println(x);
},"t2").start();
/*
运行结果:
10
*/

Fall 4

Der Schreibvorgang in die Variable vor dem Ende des Threads ist für andere Threads sichtbar, nachdem sie wissen, dass er beendet wurde (z. B. andere Threads, die t1.isAlive() oder t1.join aufrufen). () um auf das Ende zu warten)

static int x;
Thread t1 = new Thread(()->{
 x = 10;
},"t1");
t1.start();
t1.join();
System.out.println(x);
/*
运行结果:
10
*/

Fall 5

Das Schreiben von Variablen durch Thread t1 vor der Unterbrechung von t2 (Interrupt) ist für andere Threads sichtbar, nachdem sie wissen, dass t2 unterbrochen ist (durch t2.interrupted oder 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
*/

Fall 6

Die Variablen Das Schreiben des Standardwerts (0, false, null) ist für das Lesen der Variablen durch andere Threads sichtbar.

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

    }
/*
运行结果:
0
*/

Fall 7

ist transitiv, wenn x hb-> y hb-> z, dann gibt es x hb ->

Das obige ist der detaillierte Inhalt vonWas ist die „Passiert vorher“-Regel für Java-Threads?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen