当前位置: 首页 > 网络应用技术

Java内存模型详细说明

时间:2023-03-08 00:29:27 网络应用技术

  了解Java内存模型是深度学习Java的必不可少的一部分。Java内存模型是JAVA内存模型,称为JMM,定义了多线程之间共享变量的可见性,并在需要时如何同步共享变量。

  JMM规定JAVA线程之间的通信使用共享内存方法。在Java,所有成员变量,静态变量和数组元素都存储在堆内存中,并在堆中的线程之间共享,因此它们通常称为共享变量。

  JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存中。每个线程都有一个私有的本地内存(或也可以称为工作内存。工作记忆,该线程存储在本地内存中以读/编写共享变量的副本。本地内存是JMM的抽象概念,不Real.it涵盖了缓存,写作缓冲区,注册和其他硬件和编译器的优化。

  JMM的抽象示意图如下:

  当多个线程同时在相同的共享变量上读写和写入时,将生成线程安全问题。那么,为什么CPU不直接操作内存,而是添加各种缓冲区,例如缓存和CPU和内存之间的寄存器?因为CPU的操作速度比读取和写入内存的速度要快得多,如果CPU直接运行内存,则需要很长时间才能等待数据的到来,因此缓存的出现主要是求解CPU计算速度,并且内存读取速度与内存读取和写入速度不匹配。

  JMM指定主内存和工作内存的特定交互式协议,即如何将变量从主内存复制到工作内存以及如何同步工作内存之间的实现与主内存。这主要包括以下8个步骤:

  执行程序时,为了提高性能,编译器和处理器经常对指令进行分类。从Java源代码到最终实际执行的指令顺序,将经历以下三种重型分类:

  如果两个操作访问相同的变量,其中一个是写作操作,则此时两个操作之间存在数据依赖性。编译器和处理器将不会更改数据依赖性中存在的两个操作的执行顺序,也就是说,它不会对其进行排序。如何对其进行排序,执行在单个线程中导致无法更改。编译器,运行时和处理器必须遵守AS-IF serial语义。

  通过插入内存屏障(内存屏障),您可以防止重新解散特定类型的说明。JMM将内存屏障分为四种:

  Store2load1数据加载必须先于Strore2和后续处理数据到内存。Storeload barriersstore1-storeload-load2Store1将数据刷新到内存过程。在内存加载过程的Java加载过程中,挥发性关键字的关键字的实现是通过内存屏障来完成的。

  从JDK5开始,Java使用了新的JSR-133内存模型,该模型解释了基于Hapens-Before的概念操作之间的内存可见性。

  在JMM中,如果一个操作的执行结果需要可见另一个操作,则必须在两个操作之间存在hapepens-Fore-Fore-Fore。在此线程中。

  在与程序员密切相关的规则之前发生的情况如下:如下:

  注意:事件发生在两个操作之间的关系并不意味着必须在后一个操作之前执行上一个操作!执行先前操作的结果仅在后一个操作中可见,并且先前的操作在该操作之前对后一个操作顺序。