java高并发核心要点|系列4|CPU内存指令重排序(Memory Reordering)

· · 2259 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

今天,我们来学习另一个重要的概念。

CPU内存指令重排序(Memory Reordering)

什么叫重排序?

重排序的背景

我们知道现代CPU的主频越来越高,与cache的交互次数也越来越多。当CPU的计算速度远远超过访问cache时,会产生cache wait,过多的cache wait就会造成性能瓶颈。
针对这种情况,多数架构(包括X86)采用了一种将cache分片的解决方案,即将一块cache划分成互不关联地多个 slots (逻辑存储单元,又名 Memory Bank 或 Cache Bank),CPU可以自行选择在多个 idle bank 中进行存取。这种 SMP 的设计,显著提高了CPU的并行处理能力,也回避了cache访问瓶颈。

简单来说,现在CPU为了追求高性能,做了一些优化,这个优化就是重排序。

通过对指令重排,CPU可以获得更快地响应速度,****但也给编写并发程序的程序员带来了诸多挑战。

重排序会引起多线程的可见性问题。

比如线程A和线程B看到的共享区数据会不一致。

那如何来解决这个问题呢?

答案是:内存屏障。

什么是内存屏障?

简单来说,就是一条指令,这条指令指示不要对这些代码或代码块进行重排序。

java世界中用关键字:volatile,来指定这个变量使用内存屏障,来保证穿上变量不会被重排序,从来达到解决数据的可见性问题。

事实上,java一般用volatile和CAS锁来实现线程间的数据同步,达到高性能,高并发。

那么,用了volatile和CAS锁,是否就高枕无忧了呢?

否!

这里还有一个坑,那就是:伪共享问题。

请听下节分解。

本人精通java高并发,DDD,微服务等技术实践,以及python,golang技术栈。 本人姓名郭莹城,坐标深圳,前IBM架构师、咨询师、敏捷开发技术教练,前IBM区块链研究小组成员、十四年架构设计工作经验,《区块链核心技术与应用》作者之一, 现有成熟团队提供区块链开发相关业务(公链,交易所,钱包,Dapp,智能合约)。 工作微信&QQ:360369487,交易所开发与区块链钱包开发业务,加我注明:博客园+开发,想学习golang和rust的同学,也可以加我微信,备注:博客园+golang或博客园+rust,谢谢!


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2259 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传