Java语言提供了一种比Synchronized更轻量的锁机制——Volatile。为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存后再进行操作。如果对声明了Volatile的变量进行写操作,JVM就会向处理器发送一条LOCK前缀的指令,将这个变量所在的缓存行的数据写回到主存。但是,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题。所以在多处理器下,为了保证各个处理器的缓存是一致的,就需要实现缓存一致性协议,每个处理器通过嗅探在总线上传播是数据来检查自己缓存的值是否过期,当处理器发现自己缓存行对应的内存地址被修改,就会将当前缓存行设置为无效状态。当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到系统缓存里。
volatilevolatile的两条原则:
1、Lock前缀指令会引起处理器缓存回写到内存。
2、一个处理器的缓存回写到内存会导致其他处理器的缓存无效。
网友评论