伪共享(False Sharing)是多线程编程中一个很容易被忽略,但在高并发场景下又可能非常致命的性能问题。
它最迷惑人的地方在于:从业务代码上看,多个线程并没有修改同一个变量,甚至每个线程都只操作属于自己的那份数据,理论上不应该发生竞争;但从 CPU 的视角看,这些变量可能刚好落在同一个缓存行里,于是一个线程修改自己的变量时,会导致其他 CPU 核心上的缓存行失效,最终引发大量无意义的缓存同步。
所以,伪共享不是“逻辑共享”导致的问题,而是“物理存储位置太近”导致的问题。
本文内容:
- 从现代处理器的缓存结构说起
- 缓存行为什么是 CPU 缓存的基本单位
- 什么是 CPU 缓存一致性
- 为什么缓存一致性会引出伪共享问题
- 用 Java 代码演示伪共享和缓存行填充
- 伪共享的常见解决方案
- 实际项目中该如何判断和取舍
