Java jvm、jmm

volatile的内存语义

2019-04-05  本文已影响10人  codeing_java

volatile的特性

volatile写-读建立的happens-before关系

  private  int  count;  //普通变量
  private  volatile  boolean falg;  //volatile 修饰的变量
    //写操作
    public  void  writer(){
        count=1;   // 1
        falg=true;  //2
    }
    // 读操作
    public  void reader(){
        if(falg){                   //3
            int  sum=count+1;       // 4
        }
    }
  1. 程序次序规则: 1 happens-before 2,3 happens-before 4
  2. volatile规则:2 happens-before 3 。对一个volatile变量的写操作先行发生于后面对这个变量的读操作
  3. 传递规则: 1 happens-before 4 ;
image

## volatile写-读的内存语义

volatile的内存语义的实现

volatilec重排序规则

第一个操作 第二个操作
普通读/写 普通读/写: yes , volatile读 :yes, volatile写 :no,
volatile读 普通读/写: no , volatile读 :no, volatile写 :no,
volatile写 普通读/写: yes , volatile读 :no, volatile写 :no,

为了实现volatile内存语义,编译器生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。

![volatile读指令序列示意图]](https://img.haomeiwen.com/i5334889/ed1b8abe0aa32283?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

印象文档
上一篇 下一篇

猜你喜欢

热点阅读