伪共享的危害

Cache伪共享问题是编程种真实存在的一个问题,Cache伪共享导致本来无关的两个线程相互抢占资源,并行成为串行,大大降低了系统的并发性。

伪共享问题是如何产生的

考虑下面所示的Java Class结构:

class MyClass{private int a;private int b;private int b;
}

按照Java规范, MyClass的对象是在堆内存上分配空间存储的,而且a、b、c三个变量在内存空间上是临近的,如下所示:

a b c
4个字节 4个字节 4个字节

X86的CPU中 Cache Line的长度为64字节,这也就意味着 MyClass的3个变量(长度为12字节)是完全有可能加载到一个CaChe Line里的。(由于CPU读取一个字节与读取一些字节时间相差无几,所以CPU每次读取一个有多个字节组成的CaChe Line),如此一来,我们有2个线程(分别运行在不同的CPU上)分别同时读取a和b,那么a和b两个变量在一个CaChe Line并被2个不同的CPU共享,即会出现下面情况:

根据MESI协议(参考百度百科:https://baike.baidu.com/item/MESI%E5%8D%8F%E8%AE%AE/22742331?fr=aladdin),如果Thread0要对a变量进行修改,则因为CPU1上有对应的 Cache Line,这会导致CPU1的 Cache Line无效,从而使得 Thread1被迫重新从 Memory里获取b的内容(b并没有被其他CPU改变,这样做是因为b与a在一个 Cache Line里)。同样,如果Thread1要对b变量进行修改,则同样导致Thread0的 Cache Line失效,不得不重新从 Memory里加载a。如此一来,本来是逻辑上无关的两个线程,完全可以在两个不同的CPU上同时执行,但阴差阳错地共享了同一个 Cache Line并相互抢占资源,导致并行成为串行,大大降低了系统的并发性,这就是所谓的 Cache伪共享

如何解决伪共享

解决伪共享的办法很简单,在a与b之间添加无用字符,使之不分配在一个CaChe Line中,所以在JDK 8中首次提供了@Contended注释来确保类的属性不在一个CaChe Line中。

文章参考《架构解密-从分布式到微服务》-Leader-us著,中国工信出版社 电子工业出版社出版书籍。

多线程开发中Cache伪共享问题及@Contended的使用相关推荐

  1. java中什么是 伪共享_【Java】聊聊多线程中的伪共享现象

    首页 专栏 java 文章详情 0 聊聊多线程中的伪共享现象 小强大人发布于 1 月 27 日 什么是伪共享? 讲伪共享之前,让我们先乘坐时光机,回到大学课堂,来重温下计算机组成原理的基础知识.我们知 ...

  2. Linux内存管理:ARM64体系结构与编程之cache(3):cache一致性协议(MESI、MOESI)、cache伪共享

    目录 为什么系统软件人员要深入了解cache? cache一致性协议 神马是MESI协议? MESI的操作 MESI状态图 演示:初始化状态为I的cache line 当本地CPU的缓存行状态为I时, ...

  3. Java 中的伪共享详解及解决方案

    转载自  Java 中的伪共享详解及解决方案 1. 什么是伪共享 CPU 缓存系统中是以缓存行(cache line)为单位存储的.目前主流的 CPU Cache 的 Cache Line 大小都是 ...

  4. 团队开发中,xshell共享配置文件

    团队开发中,公用xshell配置文件,一次配置即可. 步骤: 1,生成公共配置文件:模仿默认配置文件生成公共配置文件.默认配置文件路径:xshell安装目录/data/Xshell/Sessions/ ...

  5. C#多线程开发-处理子线程中的异常

    C#多线程开发-处理子线程中的异常 在平时的多线程开发中,对于异常的处理是至关重要的,千万不能马虎.如果在实际的项目中,对于某些线程中的异常没有处理,会直接导致整个程序崩溃,软件无法使用. 其中需要说 ...

  6. 并发框架Disruptor(核心概念 入门 高性能原理-伪共享 CAS 环形数据 生产和消费模式 高级使用 )

    并发框架Disruptor 并发框架Disruptor Disruptor概述 背景 什么是Disruptor 为什么使用Disruptor Disruptor 的核心概念 Ring Buffer S ...

  7. 阿里云一面:并发场景下的底层细节 - 伪共享问题

    最近看书看到的伪共享问题,直接触碰到知识盲区了,之前确实没听说过这个东西,打开百度就像吃饭一样自然. 虽然面经上出现的次数不多,不过我觉得还是很重要的一个问题,而且不难,花个五分钟就能弄清楚~ 老规矩 ...

  8. 内卷老员工之三级缓存和伪共享

    cpu三级缓存与伪共享 cpu三级缓存 cpu共有L1 cache.L2 cache.L3 cache三级缓存,速度由高到低.其中L1与L2为cpu核心内共享,L3为所有cpu共享. L1.L2.L3 ...

  9. C++11开发中的Atomic原子操作

    C++11开发中的Atomic原子操作 Nicol的博客铭 原文  https://taozj.org/2016/09/C-11%E5%BC%80%E5%8F%91%E4%B8%AD%E7%9A%84 ...

最新文章

  1. LightOJ - 1038 Race to 1 Again 基础期望概率 dp
  2. Nat. Med. | 人工智能临床研究新指南
  3. JAVA 代码里中文乱码问题
  4. PowerDesigner导入MySQL数据库表
  5. [浪子学编程][MS Enterprise Library]ObjectBuilder之创建策略祥解(一)
  6. 如何用 Git 优雅回退代码,别搞错了!
  7. ca证书 csr_linux下使用openssl生成 csr crt CA证书
  8. BZOJ 2959 - 长跑
  9. 基于人脸识别的课堂签到管理系统(六)---删除,查询用户组以及人脸的添加,删除,更新
  10. Delphi一句话帮助
  11. 在mybatis里面配置外部资源文件
  12. 分享视频分析软件常用的几个C++库
  13. [uboot 移植]uboot 移植过程
  14. mp3 转c语言,c – 如何从mp3文件中提取音频数据?
  15. 求解不定方程 (扩展欧几里得算法)
  16. OpenSTF手机设备管理平台-------二次开发
  17. 【“您未被授权查看该页”的原因和解决办法】
  18. 敏捷开发一千零一问系列之二十六 如何进行优先级排序
  19. PS某色背景改为透明
  20. C语言整人的无限循环,让对方电脑自动关机的整人程序和无限循环程序-win7自动关机软件...

热门文章

  1. ToR争议—数据中心架构与布线
  2. prepareStatement介绍与使用
  3. php正则匹配字符串是否存在特殊字符
  4. 电影《人工智能》观后感
  5. linux操作系统期末考试题库
  6. 位置式PID——小车类学习心得
  7. linux重用端口号,linux下 端口复用的问题
  8. 关于伺服驱动控制的课本_电液伺服同步驱动系统控制理论与应用
  9. Apollo架构工具
  10. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换