Java多线程

java多线程(四)---volatile内存语义及实现

2019-02-06  本文已影响191人  brock

1 cpu术语的定义

术语 英文单词 术语描述
内存屏障 memory barriers 是一组处理器指令,用于实现内存操作的顺序限制
缓冲行 cache line 缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期
原子操作 atomic operations 不可中断的一个或一系列操作
缓存行填充 cache line fill 当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个缓存行到适当的缓存(L1,L2,L3或所有)
缓存命中 cache hit 如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的地址时,处理器从缓存中读取操作数,而不是从内存读取
写命中 write hit 当处理器将操作数写回到一个内存缓存的区域时,它首先会检查这个缓存的内存地址是否在缓存行中,如果存在一个有效的缓存行,则处理器将这个操作数写回到缓存,而不是写回到内存,这个操作被称为写命中
写缺失 write misses the cache 一个有效的缓存行被写入到不存在的内存区域

2. volatile的定义

  • volatile变量自身具有一下特性:
  • 可见性。对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。
  • 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性。

3 volatile写-读的内存语义

  • volatile写的内存语义:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值刷新到主内存
  • volatile读的内存语义:当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量
  • volatile重排序规。
![image](https://img.haomeiwen.com/i5982616/1fc51bbdfd76c58b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/535/format/webp)










从上表可以看出
  • 当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。
  • 当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。
  • 当第一个操作是volatile写,第二个操作是volatile读时,不能重排序。

4 volatile 内存语义的实现

4.1 JMM采取保守策略

  • JMM采取保守策略。下面是基于保守策略的JMM内存屏障插入策略
  • 在每个volatile写操作的前面插入一个StoreStore屏障。
  • 在每个volatile写操作的后面插入一个StoreLoad屏障。
  • 在每个volatile读操作的后面插入一个LoadLoad屏障
  • 在每个volatile读操作的后面插入一个LoadStore屏障
  • 上述内存屏障插入策略非常保守,但它可以保证在任意处理器平台任意的程序中都能得到正确的volatile内存语义

4.2 volatile写插入内存屏障后生成的指令序列

image

4.3 volatile读插入内存屏障后生成的指令序列

image

4.4示例

class VolatileBarrierExample {
       int a;
       volatile int v1 = 1;
       volatile int v2 = 2;
       void readAndWrite() {
           int i = v1;      // 第一个volatile读
           int j = v2;       // 第二个volatile读
           a = i + j;         // 普通写
           v1 = i + 1;       // 第一个volatile写
           v2 = j * 2;       // 第二个 volatile写
       }
       …               // 其他方法
}

针对readAndWrite()方法,编译器在生成字节码时可以做如下的优化。

image

4.5 不同的处理器(X86)

image

5 其他

参考

《java并发编程的艺术》

上一篇 下一篇

猜你喜欢

热点阅读