并发编程 volatile

本文将介绍 Java 中 volatile 关键字的作用及原理。

一、作用

1. 禁用缓存

如果某一个变量被加上了 volatile 关键字,对这个变量的读写将直接从访问内存。

2. 禁止指令重排序

编译器或运行时环境为了优化程序性能,可能会调整指令的执行顺序,这便是指令重排序。

被 volatile 关键字修饰的变量,其执行顺序不能被重排序。

二、实现原理

volatile 是基于内存屏障实现的。内存屏障,Memory Barrier,又称内存栅栏,是一种 CPU 指令。

观察编译后的 class 文件,可以发现对变量的操作指令之前增加了一个 lock 前缀,该前缀便是一种内存屏障,它提供 2 个功能:

  • 确保指令重排序时,不会将之后的指令排到之前,不会将之前的指令排到之后
  • 使处理器在进入和离开内存屏障时,将内存中的值读入缓存和将缓存中的值刷回内存,从而保障了可见性

参考