java線程之Happens before規(guī)則案例詳解
正文
happens-before 規(guī)定了對共享變量的寫操作對其它線程的讀操作可見,它是可見性與有序性的一套規(guī)則總結,拋開以下 happens-before 規(guī)則,JMM 并不能保證一個線程對共享變量的寫,對于其它線程對該共享變量的讀可見.
案例1
線程解鎖 m 之前對變量的寫,對于接下來對 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
*/
案例2
線程對 volatile 變量的寫,對接下來其它線程對該變量的讀可見
volatile static int x;
new Thread(()->{
x = 10;
},"t1").start();
new Thread(()->{
System.out.println(x);
},"t2").start();
/*
運行結果:
10
*/
案例3
線程 start 前對變量的寫,對該線程開始后對該變量的讀可見
static int x;
x = 10;
new Thread(()->{
System.out.println(x);
},"t2").start();
/*
運行結果:
10
*/
案例4
線程結束前對變量的寫,對其它線程得知它結束后的讀可見(比如其它線程調用 t1.isAlive() 或 t1.join()等待 它結束)
static int x;
Thread t1 = new Thread(()->{
x = 10;
},"t1");
t1.start();
t1.join();
System.out.println(x);
/*
運行結果:
10
*/
案例5
線程 t1 打斷 t2(interrupt)前對變量的寫,對于其他線程得知 t2 被打斷后對變量的讀可見(通過 t2.interrupted 或 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
*/
案例6
對變量默認值(0,false,null)的寫,對其它線程對該變量的讀可見
static int a;
public static void main(String[] args) {
new Thread(()->{
System.out.println(a);
}).start();
}
/*
運行結果:
0
*/
案例7
具有傳遞性,如果 x hb-> y 并且 y hb-> z 那么有 x hb-> z ,配合 volatile 的防指令重排,有下面的例子
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
*/以上就是java線程之Happens-before規(guī)則的詳細內容,更多關于線程Happens-before規(guī)則的資料請關注腳本之家其它相關文章!
相關文章
IDEA2023常用配置指南(JDK/系統(tǒng)設置等常用配置)
idea很強大,但是初次安裝默認的有很多設置并不是滿足我們開發(fā)的需要,下面這篇文章主要給大家介紹了關于IDEA2023常用配置(JDK/系統(tǒng)設置等常用配置)的相關資料,需要的朋友可以參考下2023-12-12
java解析xml的4種方式的優(yōu)缺點對比及實現(xiàn)詳解
這篇文章主要介紹了java解析xml的4種方式的優(yōu)缺點對比及實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07
Java編程通過list接口實現(xiàn)數(shù)據(jù)的增刪改查代碼示例
這篇文章是介紹Java編程基礎方面的內容,涉及l(fā)ist接口的操作,通過list接口實現(xiàn)對數(shù)據(jù)的增刪改查的相關代碼,具有一定參考價值,需要的朋友可以了解下。2017-10-10

