Java volatile原理浅析
volatile的定义与应用
volatile的通俗含义是共享变量的一致性,即在一个线程更改了该共享变量的值的时候,其他的线程能立马知道改动的发生,并且获取到新值,这一性质也可以称为“可见性”。
它在使用恰当时,开销将比synchronized更低,因为volatile不会引起线程上下文切换和调度。在某些情况下,使用volatile将比synchronized简单且效率更高。
volatile的底层实现
要理解volatile的底层实现,首先要知道cpu内部的缓存工作原理。对于cpu内部的多级缓存工作原理,可以去详细看看这篇博客:CPU缓存。此处不再赘述。
对于被volatile修饰的变量,编译后的汇编代码会多出一个带有lock前缀的指令。该指令会使得cpu在运行指令时,做出以下两个操作:
1.将当前处理器缓存行的数据写回至系统内存
2.使cpu其他缓存了该内存地址的数据无效化
接下来将详细解释这两步操作。
1.将当前缓存行的数据写回至系统内存
Lock前缀指令导致在执行指令期间,声言处理器的LOCK#信号。Lock#信号会确保在声言该信号期间独享cpu内存(有两种方式确保,在以前的处理器往往是锁住系统总线,从而保证cpu无法访问系统内存,最近的cpu对该信号做