实现原理
有volatile修饰的共享变量进行写操作时,汇编指令会生成Lock前缀。Lock前缀的指令在多核处理器下会引发两件事:
- 将当前处理器缓存行的数据写回系统内存。
- 这个写回内存的操作会使其他CPU里缓存了该内存地址的数据失效。
为了提高处理速度,处理器不会直接和内存进行通信,先将系统内存中的数据读到内部缓存,然后进行操作,但是操作完不确定时间写回内存。对使用volatile修饰的共享变量进行写操作,JVM会发出带Lock前缀的指令,将变量所在缓存行的数据写回系统内存。但是其他CPU中的数据还是旧的,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议。每个处理器通过嗅探在总线上传播的数据来检查自己缓存是否失效,当发现自己缓存行对应的内存地址被修改时,就会把当前处理器缓存行的状态设为失效,下次对该数据进行修改操作时,会从系统内存中重新读取数据到缓存中。
网友评论