Bootstrap

Java volatile原理浅析

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对该信号做

;