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

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

WBOY
Libérer: 2023-04-14 19:07:10
avant
1410 Les gens l'ont consulté

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
*/
Copier après la connexion

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
*/
Copier après la connexion

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
*/
Copier après la connexion

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
*/
Copier après la connexion

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
*/
Copier après la connexion

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
*/
Copier après la connexion

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
*/
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal