并发编程 volatile
本文将介绍 Java 中 volatile 关键字的作用及原理。
一、作用
1. 禁用缓存
如果某一个变量被加上了 volatile 关键字,对这个变量的读写将直接从访问内存。
2. 禁止指令重排序
编译器或运行时环境为了优化程序性能,可能会调整指令的执行顺序,这便是指令重排序。
被 volatile 关键字修饰的变量,其执行顺序不能被重排序。
二、实现原理
volatile 是基于内存屏障实现的。内存屏障,Memory Barrier,又称内存栅栏,是一种 CPU 指令。
观察编译后的 class 文件,可以发现对变量的操作指令之前增加了一个 lock 前缀,该前缀便是一种内存屏障,它提供 2 个功能:
- 确保指令重排序时,不会将之后的指令排到之前,不会将之前的指令排到之后
- 使处理器在进入和离开内存屏障时,将内存中的值读入缓存和将缓存中的值刷回内存,从而保障了可见性
参考
- Java 并发编程实战
- Java volatile关键字解惑 - 简书