文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java并发编程中的内存模型是什么

2023-06-25 17:04

关注

这篇文章主要介绍“Java并发编程中的内存模型是什么”,在日常操作中,相信很多人在Java并发编程中的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的内存模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、什么是Java的内存模型

Java内存模型简称JMM(Java Memory Model),JMM是和多线程并发相关的一组规范。各个jvm实现都要遵循这个JMM规范。才能保证Java代码在不同虚拟机顺利运行。因此,JMM 与处理器、缓存、并发、编译器有关。它解决了CPU 多级缓存、处理器优化、指令重排等导致的结果不可预期的问题。

Java并发编程中的内存模型是什么

2、为什么需要Java内存模型

程序的运行结果依赖于处理器,而不同的处理器规则都不一样,不同处理器差异是很大的,所以同段代码在处理器A运行正常,搬到处理器B运行结果是不一样的,所以为了兼容这种差异,推出了Java内存模型规范,JMM是一个规范标准,JMM保证了不同处理器的处理结果一致,同时也保证不同编译器、jvm等等的一致性。所以就保证了Java语言“书写一次、到处运行”

3、Java内存模型及操作规范

共享变量都是放在主内存中的

每个线程都有自己的工作内存,线程只可操作自己的工作内存

线程要操作共享变量,需要从主内存中读取到工作内存,改变值之后要从工作内存同步到主内存

Java并发编程中的内存模型是什么

4、Java内存模型规定的原子操作

Java内存模型的同步交换协议,规定了8种原子操作

原子操作:不可被中断的一个或一系列操作

Java内存模型的同步交互协议,执行上述8种原子操作时必须满足如下规则

不允许read和load,store和write操作之一单独出现。即不允许加载或同步工作到一半。

不允许一个线程丢弃它最近的assign操作,即变量在工作内存中改变之后,必须将数据同步回主内存

不允许一个线程无原因地(无assign操作)将数据从工作内存同步到主内存中。

一个新的变量可能在主内存中诞生。

一个变量在同一个时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次,多次lock之后必须要执行相同次数unlock操作,变量才会解锁

如果对一个对象进行lock操作,那么会清空工作内存变量中的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始变量的值

如果一个对象事先没有被lock,就不允许对其进行unlock操作,也不允许去unlock一个被其他线程锁住的变量。

对一个变量执行unlock操作之前,必须将此变量同步回主内存中(执行store、write)

5、Java内存模型同步协议

Java内存模型的同步协议,操作规范 将一个变量从主内存复制到工作内存要顺序执行read、load操作;要将变量从工作内存同步回主内存要用store、write操作。只要求顺序执行,不一定是连续执行

图引用网上资料:

Java并发编程中的内存模型是什么

6、Java内存模型的HB法则

并发编程有三个重要特效:原子行可见性有序性

在说JMM的happens-before(HB)法则之前,先说说并发编程的有序性。说到并发线程的有序性,还需要涉及到指令重排序

假如我们写一个程序,我们会期待这些语句的实际执行顺便和代码的顺序是一致的,大部分情况是一致的,但实际上,编译器、JVM 或者 CPU 都有可能出于优化等目的,对执行的顺序进行调整,这个就是指令重排序

代码顺序如图:

Java并发编程中的内存模型是什么

指令重排后,a=100; a= a+100会提到一起执行,效率提高

Java并发编程中的内存模型是什么

上面的例子,是可以提高执行效率,但是有时候指令重排是会导致问题的,如下代码例子,代码顺序是先初始化content,然后设置标识为true,线程B检测到为true之后,调用content的方法

Java并发编程中的内存模型是什么

如果指令重排后,这种情况就会出现没初始化完成,就直接调用conten的方法

Java并发编程中的内存模型是什么

所以,指令重排有好处也有坏处,一般可能是cpu、编译器或者是内存会进行指令重排,为了避免指令重排,保证并发编程的有序性,有时候需要使用synchronized等锁或者volatile等等方式避免

JMM规定了happens-before(先行发生)原则,来保证很多操作的有序性。

当我们代码操作不满足先行发生原则时,则需在编码时使用volatile、synchronized来保证有序性

JMM的HB法则

到此,关于“Java并发编程中的内存模型是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯