JAVA基础 之 volatile

Volatile-线程共享变量


Volatile在汇编代码中添加lock前缀,lock会做两件事:

 

  1. 将当前CPU的cache line中的数据写会系统内存。
  2. 写回内存的操作会使其他CPU里缓存了该内存地址的数据无效。

 

进一步剖析:

 

CPU为了提高处理速度先将数据载入L1 l2 l3缓存中再进行处理

 

对声明了volatile的变 量进行写操作,JVM就会像CPU发送一条Lock前缀的指令,该指令会将变量的当前cache line数据写回系统内存。

 

这时其他CPU中加载过当前内存地址的数据就变成了脏数据

这里涉及到多核CPU的缓存一致性问题,多核CPU为了数据一致性会实现缓存一致性协议。每个CPU有一个嗅探,并且有一条总线用来传播数据。

 

.Cpu通过嗅探再总线上发布的数据来检查自己的cache line 是否有过期的。当CPU发现自己的cache line中的对应的内存地址被修改,就会将当前cache line标记为无效状态。

 

当这个cpu对这个被标记无效的cache line进行操作时,就会从系统内存中重新加载数据到cache line中。

 

Lock前缀会声言处理器的lock#信号,该信号确保在声言期间,处理器可以独占共享内存。起初CPU实现原理是锁住总线,这样其他CPU就无法访问总线,进而无法访问系统内存。现代的CPU实现改为锁缓存,锁总线的开销太大。

你可能感兴趣的:(Java基础,java,volatile)