美文网首页
volatile关键字解析

volatile关键字解析

作者: 彩虹妹妹qyf | 来源:发表于2018-05-06 14:28 被阅读4次

    参考文章:
    https://www.cnblogs.com/dolphin0520/p/3920373.html

    当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。

    1.volatile关键字的两层语义

    一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:

    1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

    2)禁止进行指令重排序。

    1. volatile能保证原子性吗?
      volatile也无法保证对变量的任何操作都是原子性的。

    2. volatile能保证语句顺序吗?
      只能保证volatile之后的语句不会先执行。
      举例:

    //x、y为非volatile变量
    //flag为volatile变量
     
    x = 2;        //语句1
    y = 0;        //语句2
    flag = true;  //语句3
    x = 4;         //语句4
    y = -1;       //语句5
    

    1、2顺序不管,但 3不会在1、2之前执行,也不会在4、5之后执行。

    4.volatile的原理和实现机制

    前面讲述了源于volatile关键字的一些使用,下面我们来探讨一下volatile到底如何保证可见性和禁止指令重排序的。
      下面这段话摘自《深入理解Java虚拟机》:
      “观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”
      lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
      1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
      2)它会强制将对缓存的修改操作立即写入主存;
      3)如果是写操作,它会导致其他CPU中对应的缓存行无效。

    1. 使用场景
      (1)状态量标记
    volatile boolean flag = false;
     
    while(!flag){
        doSomething();
    }
     
    public void setFlag() {
        flag = true;
    }
     
    volatile boolean inited = false;
    //线程1:
    context = loadContext();  
    inited = true;            
     
    //线程2:
    while(!inited ){
    sleep()
    }
    doSomethingwithconfig(context);
    

    (2)双重检查double-check

    class Singleton{
        private volatile static Singleton instance = null;
         
        private Singleton() {
             
        }
         
        public static Singleton getInstance() {
            if(instance==null) {
                synchronized (Singleton.class) {
                    if(instance==null)
                        instance = new Singleton();
                }
            }
            return instance;
        }
    }
    

    相关文章

      网友评论

          本文标题:volatile关键字解析

          本文链接:https://www.haomeiwen.com/subject/wrlurftx.html