啟動時可見性
Java 語言規(guī)范規(guī)定:父線程在子線程啟動前對共享變量的更新對子線程是可見的。
代碼:
/**
* @author: kent
* @date: 2018/4/18 21:43
*/
public class ThreadStartVisibility {
static int data = 0;
public static void main(String[] args){
Thread thread = new Thread(){
@Override
public void run(){
Tools.randomPause(50);
System.out.println(data);
}
};
data = 1;//第一次更新
thread.start();
Tools.randomPause(50);
data = 2 ;//第二次更新
}
}
這里如果將第二次更新注釋掉得到的輸出將是 1,但是如果不注釋掉得到的將是 1 或者 2,因?yàn)?1 的賦值在子線程啟動前。
終止可見性
JLS 保證一個線程終止后該線程對共享變量的更新對于調(diào)用該線程的join方法的線程是可見的
/**
* @author: kent
* @date: 2018/4/19 01:44
*/
public class ThreadJoinVisibility {
static int data = 0;
public static void main(String[] args){
Thread thread = new Thread(() -> {
Tools.randomPause(50);
data = 1;
});
thread.start();
//子線程結(jié)束之后才能繼續(xù)運(yùn)行main線程
try{
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(data);
}
}
輸出結(jié)果為1,因?yàn)樽泳€程將data賦值之后結(jié)束,data對main線程可見