0
点赞
收藏
分享

微信扫一扫

volatile 的实现原理

芷兮离离 2022-04-04 阅读 72
volatilejvm

目录

volatile的作用

实现原理

如何保证可见性

Java变量的读写

volatile如何保持内存可见性

防止指令重排

参考


volatile的作用

保证变量可见性

防止指令重排序 : 例子:双重校验锁的懒汉式单例模式

实现原理

如何保证可见性

java通过几种原子操作完成工作内存和主内存的交互,volatile规定 load之前必须read,这样保证每次读的时候会从主存中读取。

Java变量的读写

Java通过几种原子操作完成工作内存主内存的交互:

  1. lock:作用于主内存,把变量标识为线程独占状态。
  2. unlock:作用于主内存,解除独占状态。
  3. read:作用主内存,把一个变量的值从主内存传输到线程的工作内存。
  4. load:作用于工作内存,把read操作传过来的变量值放入工作内存的变量副本中。
  5. use:作用工作内存,把工作内存当中的一个变量值传给执行引擎。
  6. assign:作用工作内存,把一个从执行引擎接收到的值赋值给工作内存的变量。
  7. store:作用于工作内存的变量,把工作内存的一个变量的值传送到主内存中。
  8. write:作用于主内存的变量,把store操作传来的变量的值放入主内存的变量中。

volatile如何保持内存可见性

volatile的特殊规则就是:

  • read、load、use动作必须连续出现
  • assign、store、write动作必须连续出现

所以,使用volatile变量能够保证:

  • 每次读取前必须先从主内存刷新最新的值。
  • 每次写入后必须立即同步回主内存当中。

 

也就是说,volatile关键字修饰的变量看到的随时是自己的最新值。线程1中对变量v的最新修改,对线程2是可见的。

防止指令重排

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

volatile 的底层实现原理是内存屏障, Memory Barrier

volatile 变量的写指令后会加入写屏障

volatile 变量的读指令前会加入读屏障

内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。


 

参考

volatile关键字的作用以及原理 - 知乎

volatile关键字的作用、原理 - 猴子007 - 博客园

举报

相关推荐

0 条评论