参考文章
https://blog.csdn.net/qq_45443475/article/details/131417090
产生原因
cpu 与内核数据交换的单位是 cache 行,多核 cpu 的高速缓存在对同一个变量进行修改时由于缓存一致性协议导致对应的缓存失效。
缓存行的大小 cpu 架构有关系,如果是 32 位,就是一次性处理 32 位数据,如果是 64 位,以此类推。目前处理器单次处理的数据是 2^n,目前市面上流行的是 64 位。
java 解决办法
通过对齐填充来解决这个问题,鉴于代码里会写很多跟功能无关的代码,所以 java 官方做了一个新功能。类似于 java 对象的对齐填充。
提出 JEP 142,作为 java 8 的一个增强功能,添加了 @sun.misc.Contended 和 jvm 参数 -XX:-RestrictContended 来使用此功能。其中 RestrictContended 默认值为 128,考虑到现有的处理器很少有这个的,可以手动修改为 -XX:ContendedPaddingWidth=64。
https://openjdk.org/jeps/142
https://www.zhihu.com/question/54812014/answer/2329131348
https://www.zhihu.com/question/54812014/answer/141881795
针对参数 RestrictContended 在官方文档中没找到
https://www.zhihu.com/question/619373213
java 中 ConcurrentHashMap、ForkJoinPool、Thread、Striped64、Exchanger 都有应用。