如何证明Java多线程中的成员变量的值是互不可见的
Posted 我是攻城师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何证明Java多线程中的成员变量的值是互不可见的相关的知识,希望对你有一定的参考价值。
前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义,特点和联系,其中在Java多线程里面有一个数据不可见的问题而我们知道使用volatile可以解决,但是如何证明这个多线程修改共享数据是不可见的呢?
很简单,看下面的一段代码:
private static boolean keepRunning=true;
public static void main(String[] args) throws Exception {
new Thread(
()->{
while (keepRunning){
//System.out.println();
}
}
).start();
Thread.sleep(1000);
keepRunning=false;
}
`
上面的代码是在JDK8的环境下运行的,我们看到有一个静态的boolean变量的值是true,然后在main方法中我们声明又创建了一个新的线程,并使用lambda语法创建了一个循环,接着在线程启动后我们在主线程的最后一行里把boolean变量的值给改变了。
如果两个线程的数据是可见的,那么上面的程序是会自动终止的,如果不可见则会进入一个无限循环中。
我分别在windows系统和mac系统运行上面的程序,结果都是死循环,程序永远不会停止,这也证明了我们上面的结论,然后如果把 keepRunning 变量加上volatile修饰后,程序是可以终止的,这也正是volatile关键字的作用,可以使得多个线程之间的共享数据在修改后,对其他的线程立即可见。
读书的力量
以上是关于如何证明Java多线程中的成员变量的值是互不可见的的主要内容,如果未能解决你的问题,请参考以下文章