Maison  >  Article  >  Java  >  Quelle est la règle Se produit avant des threads Java

Quelle est la règle Se produit avant des threads Java

WBOY
WBOYavant
2023-04-14 19:07:101374parcourir

Text

happens-before stipule que les opérations d'écriture sur les variables partagées sont visibles pour les opérations de lecture effectuées par d'autres threads. Il s'agit d'un résumé d'un ensemble de règles de visibilité et d'ordre. Indépendamment des règles d'happens-before suivantes, JMM ne peut pas garantir. L'écriture d'un thread dans une variable partagée est visible par la lecture de la variable partagée par les autres threads

Cas 1

L'écriture dans la variable avant que le thread ne déverrouille m est visible par la lecture de la variable par d'autres threads qui verrouillent ensuite 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
*/

Cas 2

L'écriture de la variable volatile par le thread sera visible à la lecture ultérieure de la variable par d'autres threads

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

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

Cas 3

L'écriture de la variable avant le démarrage du thread sera visible par le lecture de la variable après le démarrage du thread

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

Cas 4

L'écriture dans la variable avant la fin du thread est visible par les autres threads après qu'ils savent qu'il est terminé (comme d'autres threads appelant t1.isAlive() ou t1.join () pour attendre que ça se termine)

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

Cas 5

L'écriture des variables par le thread t1 avant d'interrompre t2 (interruption) est visible par les autres threads après avoir su que t2 est interrompu (via t2.interrupted ou 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
*/

Cas 6

Les variables L'écriture de la valeur par défaut (0, false, null) est visible par la lecture de la variable par les autres threads

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

    }
/*
运行结果:
0
*/

Cas 7

est transitive, si x hb-> y hb-> z alors il y a x hb -> z, combiné avec le réarrangement anti-commande de volatile, il y a l'exemple suivant

volatile static int x;
static int y;
new Thread(()->{ 
 y = 10;
 x = 20;
},"t1").start();
new Thread(()->{
 // x=20 对 t2 可见, 同时 y=10 也对 t2 可见
 System.out.println(x); 
},"t2").start();
/*
运行结果:
20
*/

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer