前面的几篇文章主要介绍了Java的
内存模型,进程和
线程的定义,特点和联系,其中在Java多线程里面有一个数据不可见的问题而我们知道使用volatile可以解决,但是如何证明这个多线程修改共享数据是不可见的呢?
很简单,看下面的一段代码:
class="java">````java
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修饰变量,线程也会自动终止,感兴趣的小伙伴可以思考一下这是为什么。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs) 路漫漫其修远兮,吾将上下而求索