谈谈你对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关键字?感谢你参加这次面试

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值