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

Apakah yang Berlaku sebelum peraturan untuk benang java?

WBOY
Lepaskan: 2023-04-14 19:07:10
ke hadapan
1410 orang telah melayarinya

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
*/
Salin selepas log masuk

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
*/
Salin selepas log masuk

Kes 3

Tulisan kepada pembolehubah sebelum utas bermula, bacaan pembolehubah selepas utas bermula kelihatan< . join() untuk menunggu sehingga tamat)

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

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
*/
Salin selepas log masuk

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
*/
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan