前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何证明Java多线程中的成员变量的值是互不可见的

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

作者头像
我是攻城师
发布2018-07-23 10:48:57
1.7K0
发布2018-07-23 10:48:57
举报
文章被收录于专栏:我是攻城师

前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义,特点和联系,其中在Java多线程里面有一个数据不可见的问题而我们知道使用volatile可以解决,但是如何证明这个多线程修改共享数据是不可见的呢?

很简单,看下面的一段代码:

代码语言:javascript
复制
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修饰变量,线程也会自动终止,感兴趣的小伙伴可以思考一下这是为什么。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档