Java多线程之volatile
1:定义和原理
volatile是轻量级的synchronized,在处理器中保证了共享变量的“可见性”,意味着,当一个线程改变了该共享变量时,其他线程能立马读到这个更改过后的共享变量值。该关键字的执行效率和代码比关键字synchronized的代价更低,这是因为volatile不会引起线程上下文的切换和调度。
为了更好的理解该关键字,我们先介绍几个cpu的关键术语。
- 缓冲行:缓存中可以分配的最小单位。
- 缓存命中:如果缓存操作的内存位置是下一次处理器访问的地址时,处理器会从缓存中读取操作数,而不是内存中读取。
- 写命中:当处理器将写操作写回一个内存缓存的区域时,它会首先检查这个缓存的内存地址是不是在缓存中,如果存在一个有效的缓存行,则处理器将这个操作数写回缓存,而不是写回内存中,这个操作被称为写命中。
2:实现流程
有volatile代码修饰的共享变量进行写操作时,会对出一行lock指令,该指令在多核处理器中会引发两件事。
- 将当前处理器缓存行中数据写回到系统内存中。
- 这个写内存的操作会使其他CPU中缓存了该内存地址的数据无效。
下面具体讲解这两件事情的实现细节。
2.1Lock前缀指令引起处理器缓存写回到内存
lock信号会保证该指令执行期间,处理器可以独占总线,则该期间保证缓存写回内存,同时其他处理器不会同时修改内存区的数据。
2.2缓存写回内存导致其他处理器缓存无效
在多核处理器系统中,每一个处理器都会通过嗅探技术来嗅探其他处理器访问的系统内存和内部缓存,来保证本处理器内部缓存,系统内存和其他处理器内部缓存的数据在总线保存一致。