【Java】一文全面了解伪共享(false sharing)问题

通过本文,可以收获如下知识:
① MESI协议相关
② 图例讲解伪共享问题
③ 实例讲解伪共享问题带来的性能问题
④ 使用perf进行性能分析
⑤ @Contended注解的原理

一、概述

在本文中,我们会看到伪共享问题有时会使多线程程序适得其反。

首先,我们将从缓存和局部性理论开始。然后我们会自己重写一个LongAdder并发工具类,并将其与java.util.concurrent中的实现进行基准测试。在本文中,我们将使用基准测试的结果来调研伪共享对程序性能的影响。

本文中与java相关的部分很大程度上依赖于对象的内存布局。由于这些布局细节不是JVM规范的一部分,由实现者自行决定,因此我们将只关注一个特定的JVM实现:HotSpot JVM。在本文中,JVM和HotSpot JVM术语也可以互换使用。

二、缓存行(Cache Line) 和 一致性(Coherency)

处理器会使用不同级别的缓存——当处理器从主存读取一个值时,它可能缓存该值以提高性能。

事实证明,大多数现代处理器不仅缓存了请求的值,还缓存了一些这个请求的值的附近的值。这种优化基于空间局部性的思想,可以显著提高应用程序的整体性能。简单地说,处理器缓存是根据cache line工作的,而不是单个可缓存值。

当多个处理器在相同或附近的内存位置上运行时,它们可能最终共享相同的缓存线。在这种情况下,保持不同核心中的重叠缓存彼此一致是很重要的。保持这种一致性的行为称为缓存一致性。

有相当多的协议来维护CPU核之间的缓存一致性。在本文中,我们将讨论MESI协议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值