zoukankan      html  css  js  c++  java
  • volatile-验证线程之间的可见性

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

    代码验证如下:

    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:

    2.初始参数number加上volatile:

    总结:

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

    
    
  • 相关阅读:
    开源软件架构总结之——Bash(readline做输入交互式,词法语法分析,进程交互)
    python——使用readline库实现tab自动补全
    声明式编程——抽象程度更高,关注是什么(what),而非如何做(how)
    splunk rest api search
    Elasticsearch单机下多实例配置
    splunk 通过rest http导入数据
    vnc xfce tab自动补全失效的解决方法
    止增笑耳星际前传
    [WPF]静态资源(StaticResource)和动态资源(DynamicResource)
    【 D3.js 入门系列 --- 3 】 做一个简单的图表!
  • 原文地址:https://www.cnblogs.com/adolph2715/p/11766371.html
Copyright © 2011-2022 走看看