本文主要是介绍如何证明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关键字的作用,可以使得多个线程之间的共享数据在修改后,对其他的线程立即可见。
这里留个问题,在上面的代码中,我在while循环中注释掉了一行空的打印代码,如果把注释去掉,即使没有volatile修饰变量,线程也会自动终止,感兴趣的小伙伴可以思考一下这是为什么。
这篇关于如何证明Java多线程中的成员变量数据是互不可见的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!