云时代的 JVM 原理与实战
康杨
京东资深架构师
3111 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
云时代的 JVM 原理与实战
15
15
1.0x
00:00/00:00
登录|注册

21|伪共享:如何用伪共享打造高并发、高性能的系统?

你好,我是康杨,今天我们来聊伪共享的话题。
伪共享(False Sharing)是高并发系统需要重点关注和优化的点。在计算机科学中,伪共享是多线程环境里的一种性能损失现象,当多个线程访问并修改处于同一缓存行内的不同数据时,会导致这个缓存行不断地在各个线程对应的缓存中切换,从而大大降低了系统性能,这就是所谓的伪共享现象。

Cache Line 的由来

在详细介绍伪共享之前,我们先来了解伪共享产生的背景,也就是缓存机制。
在计算机中,缓存(Cache)用于协调速度差异较大的两种硬件之间数据传输速度的差异。例如,CPU 和主存之间就有 cache 进行协调,这种存在于硬件中的 Cache 常见的有 CPU Cache、GPU Cache 等;同时在软件中也有类似的存在,比如 Web Cache。
CPU Cache 是高速缓冲存储器,它位于计算机存储系统中,介于 CPU 和主存储器之间,用来提高 CPU 从主存储器读取或写入数据的速度。它并不使用主存那样的 DRAM 技术,而采用比较快速而且昂贵的 SRAM 技术。随着 CPU 速度的提高,主存和 CPU 之间的速度差异问题日益突出,需要通过 Cache 提高存储系统速度,来提升计算机系统性能。
那么,为什么要使用缓存技术呢?首先,高速缓存是一个小且速度快的存储设备,其命中率高且成本较低、性能优越。通过使用缓存,我们能实现更高效的数据访问和处理。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了多线程环境中的性能损失现象——伪共享,以及其原因和检测方法。文章指出伪共享会导致缓存行在不同线程的缓存中切换,降低系统性能。针对伪共享问题,提出了数据对齐、数据隔离和使用无锁数据结构等解决办法。文章还介绍了在Java 8中使用 `sun.misc.Contended` 注解和Disruptor框架中避免伪共享的方法。Disruptor通过填充数据项来确保每个数据项独立存在于不同的Cache Line中,提高了数据的并行访问效率。最后,文章提出了两个思考题:伪共享的产生原因以及如何避免伪共享来提升性能。整体而言,本文深入浅出地介绍了伪共享问题及解决方法,对于高性能程序设计具有重要的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云时代的 JVM 原理与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • peter
    请教老师几个问题: Q1:伪共享不是功能问题,功能正常,但影响性能,是这样吗? Q2:Cache Line多大?是标准的吗?如果不是标准的,比如不同的CPU,其cache Line是不同的,那么,Disruptor这样的软件,需要适配不同的CPU吗? Q3:无锁数据结构为什么可以避开伪共享问题?
    2023-10-17归属地:北京
    1
    6
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部