Java并发-volitile的应用

volatile的定义

volatile是Java语言中的类型修饰符,它是被设计用来修饰被不同线程访问和修改的变量。是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”,可见性是指当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。volatile比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

实现原理

使用volatile修饰的变量在汇编阶段,会多出一条lock前缀指令,它在多核处理器下会引发两件事:

  1. 将当前处理器缓存行的数据写回到系统内存
  2. 这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。

通常处理器和内存之间都有几级缓存来提高处理速度,处理器先将内存中的数据读取到内部缓存后再进行操作,但是对于缓存写回内存的时机则无法得知,因此在一个处理器里修改的变量值,不一定能及时写回缓存,这种变量修改对其他处理器变得“不可见”了。但是,使用volatile修饰的变量,在写操作的时候,会强制将这个变量所在缓存行的数据写回到内存中,但即使写回到内存,其他处理器也有可能使用内部的缓存数据,从而导致变量不一致,所以,在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期,如果过期,就会将该缓存行设置成无效状态,下次要使用就会重新从内存中读取。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------
分享到:
0%