谈谈你对Java内存模型的理解
菜鸡每日一面系列打卡33天
每天一道面试题目
助力小伙伴轻松拿offer
坚持就是胜利,我们一起努力!
题目描述
谈谈你对Java内存模型的理解。
题目分析
Java内存模型(JMM)是一个比较难理解的概念,学习JMM有利于更深刻地理解并发编程。
并发编程一直是Java面试中的重点也是难点,菜鸡觉得在了解JMM之后,并发编程将不再是一个抽象的概念,而是可以具体到内存中的一些操作,从而能更好地把握并发编程,以及解决相关问题。
接下来,随菜鸡一起去看看吧!
题目解答
01
物理机的内存模型
内存模型是在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。仅靠这样一句干巴巴的文字很难真正了解什么是内存模型。接下来,让我们来形象地描述一下内存模型的概念。
对计算机稍有研究的小伙伴会知道,计算机处理问题的核心过程离不开CPU和内存之间的交互。而难题恰恰就出现CPU与内存之间的交互上。因为内存的I/O速度相比于CPU的运算速度实在是太慢了!
为了充分榨取CPU的运算能力,现代计算机系统加入了一层或多层I/O速度尽可能接近CPU运算速度的高速缓存,作为CPU与内存之间交互的缓冲。
引入高速缓存将运算数据从内存复制到缓存中,让CPU中的运算能快速进行,当运算结束后再从缓存同步回内存之中,从而解决了CPU的运算速度与内存的I/O速度之间的矛盾。但是,它又引入了缓存一致性的问题。为了解决该问题,需要引入缓存一致性协议。
上图展示了处理器、高速缓存、主内存间的交互关系,而这种关系就可以称之为物理机的内存模型。
另外,为了充分利用CPU内部的运算单元,CPU可能会对输入代码进行乱序执行优化,仅保证乱序执行的结果与顺序执行的结果一致。因此,如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。
02
Java内存模型
物理机有其特定的内存模型,而不同的物理机之间的内存模型是有差异的。如果某种语言依赖特定平台的内存模型,就可能会出现程序在一套平台上并发完全正常,而在另一套平台上并发访问经常出错的问题,从而在某些场景下必须针对不同的平台分别编写程序。
Java内存模型(JMM)就是被设计来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各平台下都达到一致的内存访问效果。
JMM与物理机的内存模型的设计思想是相通的,下图展示了线程、主内存、工作内存三者的交互关系,对比物理机的内存模型来看,更容易领悟其设计思想。
Java虚拟机与物理机不仅在内存模型上有对应,在指令重排序方面也有类似的问题。为此,Java虚拟机提供了volatile关键字来保证可见性和防止指令重排序。
想要详细了解volatile关键字的小伙伴请看这篇每日一面——没用过volatile关键字?感谢你参加这次面试。
参考资料
《深入理解Java虚拟机》第3版 周志明
相关链接
每日一面——没用过volatile关键字?感谢你参加这次面试
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到