启动时可见性
Java 语言规范规定:父线程在子线程启动前对共享变量的更新对子线程是可见的。
代码:
/**
* @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
,因为 1
的赋值在子线程启动前。
终止可见性
JLS 保证一个线程终止后该线程对共享变量的更新对于调用该线程的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();
//子线程结束之后才能继续运行main线程
try{
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(data);
}
}
输出结果为1,因为子线程将data赋值之后结束,data对main线程可见