本文主要介绍了模型产生的问题的背景、解决的问题、处理思路以及相关的实现规则,这些都是密切相关的,希望读者看完后能够对Java内存的模型体系有一个比较清晰的认识这篇文章,知道它是什么以及为什么它是这样。
内存模型上下文
在介绍Java内存模型之前,Java课程认为首先应该了解并发问题了解物理计算机的这些问题,可以理清内存模型的背景。
物理机面临的并发问题与虚拟机的情况有很多相似之处。物理机解决方案对于虚拟机的实现具有重要的参考意义。
物理机的并发问题
硬件效率问题
计算机处理器不可能仅仅依靠处理器的“计算”来处理大部分正在运行的任务。要完成,处理器至少必须与存储器交互,例如通过读取操作数据并存储操作结果。这种I/O操作很难消除(仅使用寄存器不可能完成所有计算任务)。
由于计算机存储设备的处理速度与处理器的处理速度存在几个数量级的差距,为了防止处理器等待慢速内存完成读写操作,现代计算机系统添加一层读写速度尽可能接近处理器的速度。
缓存充当内存和处理器之间的缓冲区:将操作所需的数据复制到缓存中,以便可以快速执行操作。一旦操作完成,内存就会再次从缓存中同步。
缓存一致性问题
基于缓存的存储系统的交互可以解决处理器和内存速度之间的矛盾,但也给计算机系统带来了更多的复杂性,因为它是一种新的存储系统。引入的问题:缓存一致性。
在多处理器系统(或单处理器多核系统)中,每个处理器(每个核心)都有自己的缓存并共享相同的主内存(MainMemory)。
当多个处理器的处理任务涉及同一主存区域时,各自的缓存数据可能会不一致。
为此,每个处理器在访问缓存时必须遵循一些协议,并在读写时按照协议进行操作,以保持缓存的一致性。
仔细观察Java内存模型和MESI协议:它们如何协同工作
世界上两个内存守护者:MESI和JMM
JMM,Java内存模型的阶段
相比之下,JMM(JavaMemoryModel)是在Java语言级别设计的,处理记忆。一致性,尤其是并发编程的三大特征:原子性(存在操作不可分割的情况)、顺序性(操作的执行顺序与代码编写的顺序一致)、可见性(公共变量的引用可见)线程之间)。JMM通过像程序员期望的多线程环境中的程序一样通过volatile和synchronized等关键字来实现这些功能。硬件和软件之间的桥梁
在Java多线程中,每个线程都有自己的操作和内存到主存。互联网尽管工作记忆与计算机硬件相似,但它们侧重于不同的领域。当多个线程访问不一致的共享变量时,内存一致性问题发生在编程级别,而不是单元级别的硬件冲突。因此,了解内存一致性和一致性之间的关系非常重要。MESI集成和一致性内存模型
在一致性内存模型的实现过程中,一致性协议会缓存操作MESI的部分。幕后英人物的形象。它通过协调缓存之间的数据状态间接支持并发多线程操作的内存模型规范。也就是说,JMM在涉及到内存一致性问题时,可以依靠缓存一致性协议来协调同步。
总之,虽然MESI协议和Java内存模型(JMM)看起来是独立的,但在多线程编程的世界中,它们是相互依赖的并将程序结合在一起。直线度了解他们的协作有助于我们编写高效可靠的并发代码。
Java平台自动集成了线程和多处理器技术,这种集成程度比Java之前诞生的计算机语言要强得多。这种语言用于异构多平台的多线程技术也具有开创性的一面,有时在开发具有严格Java并发和线程安全要求的程序时,经常会混淆一个概念,那就是内存模型。内存模型到底是什么?内存模型描述了程序中不同变量(实例字段、常量字段和数组元素)之间的关系,以及在内存中存储变量和从内存中检索变量的低级细节。在实际的计算机系统中,对象是最终存储在内存中,因此这没有任何问题,但编译器、运行时库、处理器或系统缓存可以有权在变量指定的内存位置存储或检索变量的值。[JMM](JavaMemoryModel的缩写)允许编译器和缓存在处理器缓存(或寄存器)和主内存之间传输数据的顺序上拥有重要的特权,除非程序员明确请求具有某种最终或同步可见性保证的东西。
上一篇:华为云计算hcie的工作前景
下一篇:java内存模型包含什么