- 缓存系统中是以缓存行(cache line)为单位存储的。
- 最常见的缓存行大小是64个字节。
- 当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。
- 在核心1上运行的线程想更新变量X,同时核心2上的线程想要更新变量Y。
- 不幸的是,这两个变量在同一个缓存行中。每个线程都要去竞争缓存行的所有权来更新变量。
- 如果核心1获得了所有权,缓存子系统将会使核心2中对应的缓存行失效。
- 当核心2获得了所有权然后执行更新操作,核心1就要使自己对应的缓存行失效。
- 这会来来回回的经过L3缓存,大大影响了性能。
- Java7 之前加入闲置的long字段来填充缓存行来避免伪共享。
- Java 7,因为变得更加智慧了,它淘汰或者是重新排列了无用的字段,这样我们之前的办法在Java 7下就不奏效了,所以伪共享依然会发生。(待续)