如何证明Java多线程中的成员变量数据是互不可见的_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 如何证明Java多线程中的成员变量数据是互不可见的

如何证明Java多线程中的成员变量数据是互不可见的

 2018/6/21 12:20:48  qindongliang1922  程序员俱乐部  我要评论(0)
  • 摘要:前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义,特点和联系,其中在Java多线程里面有一个数据不可见的问题而我们知道使用volatile可以解决,但是如何证明这个多线程修改共享数据是不可见的呢?很简单,看下面的一段代码:````javaprivatestaticbooleankeepRunning=true;publicstaticvoidmain(String[]args)throwsException{newThread(()->{while(keepRunning)
  • 标签:多线程 Java 数据 线程

前面的几篇文章主要介绍了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) 路漫漫其修远兮,吾将上下而求索




上一篇: Finally使用时报"finally block does not complete normally" 下一篇: 没有下一篇了!
发表评论
用户名: 匿名