文章目录
一、volatile简述
volatile是JMM的一种具体实现方式,是一种轻量级的synchronized,用于修饰共享变量,在多线程环境下能够保证原子性、可见性、有序性。
二、volatile如何解决可见性问题
volatile修饰的变量如何保证在其被修改之后,能够被其他线程立马得到修改之后的值?
缓存一致性协议
当CPU写数据的时候发现这个变量是共享变量的时候,会发出信号通知(总线嗅探)其他CPU将该变量的缓存设置成无效状态,因此当其他CPU需要读取的时候,发现当前变量的缓存行被设置成无效了,自然会到主内存中读取最新的变量值。(那么其他CPU如何发现数据是否无效呢?)
总线嗅探
每个处理器通过嗅探在总线上传播的数据来检查自己的缓存是不是过期了,如果过期了,则会将自己的处理器缓存行设置成无效状态,等下次处理器去读取缓存行的时候会发现缓存过期,自然去主内存中读取最新的数据。
总线风暴
由于volatile的缓存一致性,需要其他CPU不断地从主内存嗅探,无效的交互会导致总线带宽达到峰值,因此不要大量使用volatile。
三、volatile如何做到有序性,禁止指令重排序
为什么会重排序?
因为在程序执行时,为了提高性能,编译器和处理器</