原文链接https://zhuanlan.zhihu.com/p/22755195
这个问题比较深,估计我目前是接触不到。但还是很有必要分享一下。建议直接看原文。
由于并发的原因,会出现两个变量共用一个缓存块,所以当一个线程改变其中一个变量的时候,那么所有含当前变量的缓存块将会失效,那么失效缓存块中的另一个变量也会失效。那么当其他线程访问这个变量时它却失效了,那么得重新从内存里读取,那缓存没有让性能变快,反而变慢了。这个就是伪共享。
举例子
内存的一个块里有a和b两个变量,那么两个线程A和B中分别会加载一个缓存,a和b变量一定也都在缓存里面的一个块内。当A线程改变了a值时,B线程的缓存里面包含a变量的块就会失效,与此同时和a同一个块内的b变量也随着块失效而失效了。当这个时候B线程访问b变量时,就得重新去内存里读取,读取速度反而比直接去内存读取慢了(因为内存读写慢,才会有高速缓存来提高性能)。