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

Posted 我是攻城师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何证明Java多线程中的成员变量的值是互不可见的相关的知识,希望对你有一定的参考价值。

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

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

 
   
   
 
  1.    private  static boolean  keepRunning=true;

  2.    public static void main(String[] args)  throws Exception {

  3.        new Thread(

  4.                ()->{

  5.                    while (keepRunning){

  6.                        //System.out.println();

  7.                    }

  8.                }

  9.        ).start();

  10.        Thread.sleep(1000);

  11.        keepRunning=false;

  12.    }

`

上面的代码是在JDK8的环境下运行的,我们看到有一个静态的boolean变量的值是true,然后在main方法中我们声明又创建了一个新的线程,并使用lambda语法创建了一个循环,接着在线程启动后我们在主线程的最后一行里把boolean变量的值给改变了。

如果两个线程的数据是可见的,那么上面的程序是会自动终止的,如果不可见则会进入一个无限循环中。

我分别在windows系统和mac系统运行上面的程序,结果都是死循环,程序永远不会停止,这也证明了我们上面的结论,然后如果把 keepRunning 变量加上volatile修饰后,程序是可以终止的,这也正是volatile关键字的作用,可以使得多个线程之间的共享数据在修改后,对其他的线程立即可见。

读书的力量

以上是关于如何证明Java多线程中的成员变量的值是互不可见的的主要内容,如果未能解决你的问题,请参考以下文章

高级java必须清楚的概念:原子性可见性有序性

java中证明成员变量有默认初始值

volatile详解

Java中的关键字volatitle

java并发编程之volatile关键字

volatile为啥不能保证原子性