当前位置:首页 > 内存 > 正文

java内存模型详细图解

  • 内存
  • 2024-05-04 15:45:47
  • 7601

一、Java内存模型详解Java的内存模型:深入剖析与模型分析

在并发Java编程的世界里,通信和同步是核心要素。Java的内存模型主要基于共享内存。每个线程都有自己的私有本地内存,共享变量存储在主内存中。线程之间的通信由Java内存模型(JMM)精确控制,以确保本地内存的更新与主内存正确同步,并且其他线程可以读取最新状态。编译器和处理器的排序行为可能会给内存可见性带来挑战。


直观地理解,当线程A更新共享x变量时,这个变化会通过JMM从本地内存传输到主内存,然后线程B会读取更新后的值,基本上是如何内存模型有效。


编译器优化、程序级并行、系统内存重组等现象,可能会导致乘法中的微妙问题。JMM使用微妙的规则(例如StoreLoad屏障)来管理和防止导致问题的特定重新排列。例如,StoreLoad屏障可确保全局内存访问顺序的一致性,即使在多处理器架构中也是如此。
内存模型的关键概

JMM是一种抽象级语言,可确保跨平台内存可见性。重新排序内存的过程会导致操作以与预期不同的顺序执行。编译器通过插入内存缓冲区警告(例如LoadLoad、StoreStore、LoadStore和StoreLoad块)来保持一致性。


JSR-133提出了可见内存在操作之间定义的概念。此概念并不强制操作按特定顺序执行,而是要求先前的操作对后续操作可见。happens-before关系与JMM紧密相连,简化了理解内存重组的复杂性。依赖关系分为三种类型,编译器和处理器遵循这些规则,使得简单程序的执行顺序保持不变。


重排序和多线程示例

在多线程编程中,线程B重新排序以删除共享变量值,尤其是在线程A更新之后。超级客户端可能会导致进程执行推测执行,这可能会导致意外的乘法结果。正如同步模型中所演示的,JMM确保正确同步的代码遵循一致性,即所有序列中的操作顺序都是一致的。


JMM通过互斥执行来限制关键部分的重新排序,从而允许执行编译器和处理器优化。对于未正确同步的程序,JMM提供基本的内存可见性保证,但不提供完全符合序列一致性模型。这些差异按处理机制可能导致的简单操作、原子长/双精度类型和非原子读写的顺序排列。


在内存可见性方面,例如计算电路的面积,JMM使得为所有涉及内存操作的序列提供一致的结果成为可能。JMM的简单概述如下:


在圆域中,在A->B、B->C关系发生之前对性能没有影响,JMM强调了这些关键已知记忆模型的关系
JMM区分影响执行结果的重组和允许改进的重组。
JMM格式的设计强调其在内存可见性保证以及对编译器和处理器的最小约束方面的简单性。

可见内存的强大之处在于,无论是单线程还是多线程,都能保证代码正确同步,保证执行的可靠性。同时,JMM针对不完全同步场景提供了基本的保护,这样问题就不会变得毫无用处。


最后,JSR-133引入的volatile和Final关键字增加了可见内存,保证了代码的正确性和初始化的安全性。总体而言,Java内存模型是一种平衡设计,旨在满足程序的编程需求,同时保持与编译器和处理器优化的兼容性。