volatile缓存可见性实现原理
1.缓存一致性问题
在多核处理器架构中,每个核心都有自己的缓存(Cache),而主内存是所有核心共享的。当一个线程在某个核心上修改了一个共享变量时,这个修改可能只会更新到该核心的缓存中,并不会立刻写回到主内存中。其他核心上的线程读取这个变量时,可能会从它们自己的缓存中读取旧值,而不是最新的值。
2.缓存一致性协议
现代处理器使用特定的缓存一致性协议来维护多个缓存之间的一致性。最常见的是 MESI 协议(Modified, Exclusive, Shared, Invalid)。MESI 协议确保了当一个缓存行的状态发生变化时(例如,被标记为“已修改”或“无效”),其他缓存中的相应数据也会被更新或标记为失效。
当一个线程对 volatile 变量进行写操作时,根据 MESI 或类似的协议,这个写操作会强制将该变量对应的缓存行状态设为“无效”,从而导致其他核心在尝试访问这个变量时不得不从主内存中重新加载最新的值,从而实现了可见性。
3.可见性实现原理
底层是通过汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定),并回写到主内存。
lA-32和Intel 64 架构软件开发者手册对lock指令的解释:
1)将当前处理器缓存行的数据立即写回到系统系统内存。
2)这个回写内存的操作会引起在其他CPU里缓存了该内存地址的数据无效(MESI协议)
3)提供内存屏障功能,使lock前后指令不能重排序。