使用volatile怎么验证线程之间的可见性

这篇文章将为大家详细讲解有关使用volatile怎么验证线程之间的可见性,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

创新互联-专业网站定制、快速模板网站建设、高性价比武宣网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式武宣网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖武宣地区。费用合理售后完善,十多年实体公司更值得信赖。

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存 模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副木拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图:

使用volatile怎么验证线程之间的可见性

代码验证如下:

import java.util.concurrent.TimeUnit;

class MyData{
   //定义初始参数,volatile关键字使用为重点
   volatile int number = 0;
   //更改初始参数
   public void changeNumber(){
     this.number = 60;
   }
}
public class VolatileDemo {
  public static void main(String[] args) {
    //初始化资源类
    MyData myData = new MyData();
    new Thread(() -> {
      System.out.println(Thread.currentThread().getName()+"初始化线程,初始参数为:"+myData.number);
      //AAA线程暂停三秒后
      try{
        TimeUnit.SECONDS.sleep(3);
      }catch(Exception e){
        e.printStackTrace();
      }
      //AAA线程更改初始化参数为60
      myData.changeNumber();
      System.out.println(Thread.currentThread().getName()+"线程更改初始化参数为:"+myData.number);
    },"AAA").start();

    while(myData.number == 0){
      //第二个线程是main线程,在number=0时则一直陷入死循环,当number=60时则打印主线程语句。
    }
    System.out.println(Thread.currentThread().getName()+"主线程当前参数:"+myData.number);
  }
}

结果展示:

1.初始参数number未加上volatile:

使用volatile怎么验证线程之间的可见性

2.初始参数number加上volatile:

使用volatile怎么验证线程之间的可见性

总结:

volatile是JAVA虚拟机提供的轻量级的同步机制,volatile三大特征:保证可见性,不保证原子性,禁止指令重排。

关于使用volatile怎么验证线程之间的可见性就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


网站栏目:使用volatile怎么验证线程之间的可见性
网页URL:http://csdahua.cn/article/pccegd.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流