打赏

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

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

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锁,是否就高枕无忧了呢?

否!

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

请听下节分解。

 

posted @   gyc567  阅读(448)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示