Rumah  >  Artikel  >  Java  >  Apakah yang Berlaku sebelum peraturan untuk benang java?

Apakah yang Berlaku sebelum peraturan untuk benang java?

WBOY
WBOYke hadapan
2023-04-14 19:07:101388semak imbas

Teks

berlaku-sebelum menetapkan bahawa operasi tulis pembolehubah kongsi kelihatan kepada operasi baca urutan lain Ia adalah ringkasan set peraturan untuk keterlihatan dan susunan yang berikut happens-before rules , JMM tidak menjamin bahawa penulisan thread kepada pembolehubah kongsi akan kelihatan kepada bacaan thread lain bagi pembolehubah kongsi.

Kes 1

Tulis kepada pembolehubah sebelum benang membuka kunci m akan kelihatan kepada seterusnya Bacaan pembolehubah oleh utas lain yang dikunci pada m boleh dilihat

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

Kes 2

Tulisan pembolehubah tidak menentu oleh utas ialah boleh dilihat dengan bacaan seterusnya pembolehubah oleh utas lain

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

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

Kes 3

Tulisan kepada pembolehubah sebelum utas bermula, bacaan pembolehubah selepas utas bermula kelihatan

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

Kes 5

Benang t1 menulis pembolehubah sebelum mengganggu t2 (gangguan bacaan pembolehubah selepas utas lain mengetahui bahawa t2 terganggu). boleh dilihat (melalui t2.interrupted atau t2.isInterrupted)

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

Kes 6

Tulisan nilai lalai pembolehubah (0, palsu, null) kelihatan kepada bacaan daripada pembolehubah oleh urutan lain

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

Kes 7

Ia adalah transitif Jika x hb->

Atas ialah kandungan terperinci Apakah yang Berlaku sebelum peraturan untuk benang java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam