Skip to content

Latest commit

 

History

History
19 lines (14 loc) · 1.14 KB

FalseSharing.md

File metadata and controls

19 lines (14 loc) · 1.14 KB

伪共享(False Sharing)

一、什么是伪共享?

  • 缓存系统中是以缓存行(cache line)为单位存储的。
  • 最常见的缓存行大小是64个字节。
  • 当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。

二、伪共享的问题?

  • 在核心1上运行的线程想更新变量X,同时核心2上的线程想要更新变量Y。
  • 不幸的是,这两个变量在同一个缓存行中。每个线程都要去竞争缓存行的所有权来更新变量。
  • 如果核心1获得了所有权,缓存子系统将会使核心2中对应的缓存行失效。
  • 当核心2获得了所有权然后执行更新操作,核心1就要使自己对应的缓存行失效。
  • 这会来来回回的经过L3缓存,大大影响了性能。

三、伪共享的解决

  • Java7 之前加入闲置的long字段来填充缓存行来避免伪共享。
  • Java 7,因为变得更加智慧了,它淘汰或者是重新排列了无用的字段,这样我们之前的办法在Java 7下就不奏效了,所以伪共享依然会发生。(待续)