Volatile的应用

时间:2021-08-11 15:04:46

.java 的执行过程

  1. Java代码在编译后会变成Java字节码
  2. 字节码被类加载器加载到JVM里
  3. JVM执行字节码,转化为汇编指令在CPU上执行

  Java中所使用的并发机制依赖于JVM的实现和CPU的指令

变量修饰符-volatile

  volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性。

  可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

  volatile使用恰当的话,比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

  volatile的定义

  Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。

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

  摘自《Java并发编程的艺术》,后续作者对比JDK源码与实际不符,自己研究后再规整。