Heim > Java > javaLernprogramm > Hauptteil

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

WBOY
Freigeben: 2023-04-14 19:07:10
nach vorne
1388 Leute haben es durchsucht

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
*/
Nach dem Login kopieren

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
*/
Nach dem Login kopieren

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
*/
Nach dem Login kopieren

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
*/
Nach dem Login kopieren

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
*/
Nach dem Login kopieren

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
*/
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage