Fork me on GitHub

【Java多线程】Volatile关键字

volatile

1. 前言

  • 最轻量级的同步机制
  • 具有对所有线程具有可见性,但不具有原子性
  • 禁止指令重排序优化

适用场景:

  • 运算结果不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值
  • 变量不需要与其他的状态变量共同参与不变约束

2. 原理

处理器为了提高运行速度,不直接与内存进行通讯,而是通过先将内存中的数据读到内部缓存再进行操作,操作完后写入内存时间不确定

对volitale变量写操作时候,JVM会发送一条lock前缀的指令,lock前缀指令会引起处理器缓存回写到内存,将这个变量缓存行的数据重新写回到内存

为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议(MESI协议等),每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。

缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据。