伪共享

在理解伪共享之前我们需要先了解 Cache行,如下图所示,在 CPU 需要访问某个变量时会先去 CPU Cache 中查找是否存在该变量,如果存在则直接从中获取,如果不存在则会去主内存中获取这个变量,然后将该变量所在的内存区域中一个 Cache行 大小的内存复制到 Cache 中。因为存放在同一个 Cache行 中的是一个内存块而不是单个变量,所以在一个 Cache行 会出现存在多个变量的情况。

uml diagram
Note

伪共享即是当多个 线程(或处理器)同时处理修改一个 缓存行 时因为数据一致性的策略(即当前 缓存行 被修改时会导致 缓存行 的更新,这可能导致 缓存行 失效或需要重新加载)这种失效和重新加载会降低系统的性能。

Tip

为了避免伪共享,可以使用对齐或填充等技术来确保不同缓存行之间的距离足够远,从而减少多个处理器同时访问同一块缓存行的可能性。

参考

Java并发编程之美#2.11 伪共享