先来了解一些相关的概念
缓存行(Cache Line):是缓存系统中的缓存单位;现代中央处理器的缓存系统中是以缓存行为单位存储的。
缓存一致性:根据主流CPU为保证缓存有效性的MESI协议的简单理解,如果一个核正在使用的数据所在的缓存行被其他核修改,那么这个缓存行会失效,需要重新读取缓存。
(在某时刻,一份缓存可能会存在于不同的缓存空间内;缓存一致性要求各个缓存区间内的同一份缓存必须一致,否则该缓存视为无效。)
伪共享问题:
当多线程修改互相独立的变量时,如果这些变量恰好共享同一个缓存行,就会彼此影响(写回、无效化或者同步)而导致性能降低。
例子:
现有两个没多大关系的变量a和变量b,
也有两个没多大关系的线程A和线程B;
其中线程A要改变变量a的值,而线程B要改变变量b的值。
此时,变量a和变量b在同一个缓存行,且该缓存行存在不同的缓存区中(假如存在于甲缓存区和乙缓存区,线程A恰好访问的是甲,线程B恰好访问的是乙)。
线程A先对甲缓存区读取并改变了缓存行中的变量a;
此时,甲缓存区中的缓存行数据与乙缓存区的不一致了(即乙缓存区的这个缓存行已无效)。
如此一来,线程B想修改变量b,只能将变量b重新载入缓存区。
参考连接:
伪共享简介–XHLeee
有点java基础就能看懂的【伪共享】详解加面试–IT楠老师
这仅是个人理解,未经考验;如有错漏,恳请指点、反馈。