并发CPU伪共享及优化

伪共享

缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚是否会出现伪共享。

解决 

 Disruptor中:

在JDK 8 提供了一种消除伪内存的方式(需要使用JDK8 ,JDK12 不支持):

1、在code中添加sun.misc.Contended注解;
2、将JVM参数配添加上-XX:-RestrictContended;

ps:绝大多数情况下,我们的程序应该涉及不到这么深,CPU缓存是很宝贵的资源,没绝对必要的情况下一般不要去填充浪费。

参考1:https://blog.csdn.net/rrrfff/article/details/44993183
参考2:http://ifeve.com/falsesharing/comment-page-1/

 

posted @ 2020-06-14 17:34  天天代码码天天  阅读(13)  评论(0编辑  收藏  举报  来源