Java内存模型(JMM)详解

文章目录

  • 1、Java内存模型
  • 2、JMM的核心概念
    • 1)主内存与工作内存
    • 2)内存可见性
    • 3)JMM的三大特性:原子性、可见性、有序性。
  • 3、JMM中的八种操作
  • 4、Happens-before 规则
  • 5、样例:

1、Java内存模型

Java内存模型(Java Memory Model,JMM)是一种抽象的概念,用于定义多线程程序如何与内存进行交互。JMM并不真实存在,它是一种规范,规定了程序中变量在内存中的访问方式。

计算机在执行程序时,每条指令都是在CPU中执行的。而执行指令的过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程,跟CPU执行指令的速度比起来要慢的多(硬盘 < 内存 <缓存cache < CPU)。因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。也就是当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时,就可以直接从它的高速缓存中读取数据或向其写入数据了。当运算结束之后,再将高速缓存中的数据刷新到主存当中。
在这里插入图片描述

2、JMM的核心概念

1)主内存与工作内存

  • 主内存:所有变量都存储在主内存中,主内存是共享的。
  • 工作内存:每个线程都有自己的工作内存,工作内存中保存了主内存中变量的副本。线程对变量的所有操作(读取、写入)都在工作内存中进行,最后再将结果同步回主内存。

2)内存可见性

  • JMM规定了线程对变量的读取和写入顺序,确保变量的修改在其他线程中可见。即,当一个线程修改了变量的值,其他线程最终能看到这个修改后的值。

3)JMM的三大特性:原子性、可见性、有序性。

  • 原子性
    一个或多个操作,要么全部执行,要么全部不执行(执行的过程中是不会被任何因素打断的)。

  • 可见性
    一个线程对共享变量的修改,能够被其他线程看到。通过 volatile 关键字、锁(如 synchronized)来实现可见性。

  • 程序的执行在实际运行时可能会被重排序,但JMM提供了一定的保证,使得某些操作在多线程环境中会按照程序的顺序执行。

3、JMM中的八种操作

JMM抽象了线程和主内存之间的关系,定义了以下八种操作来完成主内存和工作内存之间的交互:

• lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。

• unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。

• read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用。

• load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。

• use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。

• assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。

• store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。

• write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

在这里插入图片描述

4、Happens-before 规则

JMM还定义了一个重要的概念:happens-before,它是判断数据是否存在竞争、线程是否安全的依据。happens-before原则规定了以下几种情况:

• 程序次序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。

• 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。

• volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。

• 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。

• start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。

• join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

• 中断规则:对线程interrupt()方法的调用happens-before于被中断线程的代码检测到中断事件的发生。

• 终结器规则:对象的构造函数执行、结束happens-before于它的finalize()方法的开始。

JMM定义了一组 happens-before 规则,用来确定操作之间的顺序,确保内存可见性和有序性

5、样例:

public class VolatileExample {private volatile boolean flag = false;public void writer() {flag = true;  // 写操作,保证对其他线程可见}public void reader() {if (flag) {  // 读操作,确保读取到最新值System.out.println("Flag is true");}}
}public class SynchronizedExample {private int count = 0;public synchronized void increment() {count++;  // synchronized 确保可见性和原子性}public synchronized int getCount() {return count;  // synchronized 确保读取最新值}
}

在 VolatileExample 中,flag 变量使用 volatile 修饰,确保在一个线程修改 flag 后,其他线程能够立即看到变化。在 SynchronizedExample 中,increment 和 getCount 方法使用 synchronized 修饰,确保操作的可见性和原子性。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统安全(补充)

基于行的自主访问控制的方法有能力表、前缀表、口令基于列的自主访问控制的方法有访问控制表、保护位口令是当前大多数网络实施访问控制进行身份鉴别的重要依据&#xff0c;因此&#xff0c;口令管理尤为重要&#xff0c;一般遵守一般遵守以下原则&#xff1a;1口令选择应至少在…

一种可以识别局部单调的系数

记录一种可以识别局部单调的系数 pearson和kendall等系数再识别单调的时候&#xff0c;更多是关注整体情况&#xff0c;很多时候&#xff0c;变量和因变量之间非简单的单调关系&#xff0c;局部单调ξ识别 假设我们正在测量变量X和Y之间的关系。传统的相关性测量方法通常假定…

Go - 3.库源码文件

目录 一.引言 二.库源码文件 1.定义 2.生成库源码文件 3.直接调用库源码文件 三.总结 一.引言 前面我们学习了 命令源码文件&#xff0c;并成功运行了 go 的 hello world 代码&#xff0c;下面我们介绍 go 里面另一个概念: 库源码文件。 二.库源码文件 1.定义 库源码文…

一看就会!Win11文件资源管理器的打开方法!

在Win11电脑操作中&#xff0c;用户可以借助文件资源管理器轻松管理文件或文件夹。但是&#xff0c;许多新手用户不知道要怎么操作才能顺利打开文件资源管理器&#xff1f;接下来小编给大家介绍五种简单快速的打开Win11系统文件资源管理器的方法。 方法 1&#xff1a;WindowsE …

企业邮箱大附件无法上传?无法确认接收状态?这样解决就行

Outlook邮箱作为最常用的邮箱系统&#xff0c;被全世界企业采用作为内部通用沟通方式&#xff0c;但Outlook邮箱却有着明显的使用缺陷&#xff0c;如邮箱大附件上传障碍及附件接收无提示等。 1、企业邮箱大附件无法上传 Outlook企业邮箱大附件的上传上限一般是50M&#xff0c;…

SpringSecurity6从入门到实战之自定义登录页面

SpringSecurity6从入门到实战之自定义登录页面 在使用SpringSecurity进行认证操作的时候,可以发现默认提供的登录页面比较简陋.那么我们能否对登录页面进行自定义配置呢?接下来开始讲解应该如何进行配置 自定义登录页面流程 引入模板依赖 由于自定义登录页面会使用到前端相关…

测试单选框

单选按钮&#xff1a;用于在一组互相排斥的选项中选择其中一项&#xff1b; 由一个圆圈和紧随其后的文本标题组成&#xff0c;当它被选中时&#xff0c;圆圈中就标上一个黑点。 通常将一组单选按钮放在一个组框控件中&#xff0c;在一组单选按钮中&#xff0c;第一个(Tab键顺序…

【Linux】版本

文章目录 linux版本1、linxu技术版本&#xff08;内核版本&#xff09;2、linux商业化版本&#xff08;发行版本&#xff09; 区别 linux版本 1、linxu技术版本&#xff08;内核版本&#xff09; 内核&#xff1a;提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程…

PyTorch与TensorFlow模型互转指南

在深度学习的领域中&#xff0c;PyTorch和TensorFlow是两大广泛使用的框架。每个框架都有其独特的优势和特性&#xff0c;因此在不同的项目中选择使用哪一个框架可能会有所不同。然而&#xff0c;有时我们可能需要在这两个框架之间进行模型的转换&#xff0c;以便于在不同的环境…

高考志愿填报,理科生如何分析选专业?

理科生选择专业的范围更大一些&#xff0c;相比文科说理工科的院校也更多&#xff0c;如何选择适合自己的专业&#xff0c;这是一个比较重要的课题&#xff0c;毕竟大学专业直接关系到职业&#xff0c;是一辈子的大事。 那么理科究竟如何选择专业呢&#xff1f;需要从什么地方…

RPC框架知识学习

RPC框架介绍 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架是一种允许程序调用位于另一台计算机上的程序的技术。这种调用看起来就像是调用本地程序一样&#xff0c;但实际上是通过网络进行的。RPC框架使得分布式系统的开发变得更加简单&…

【VUE3学习手札】

VUE3学习手札 vue3成长之路学习笔记 文章目录 VUE3学习手札前言一、markRaw1.1 代码示例1.2 应用场景1.3 拓展&#xff08;toRaw&#xff09;1.4 实际应用 二、ref 和 reactive 前言 主要用于自己的一个备忘&#xff0c;对知识点的查缺补漏 一、markRaw 将一个对象标记为不可被…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 02:设计并使用断言

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

JeecgFlow排他网关演示

排他网关概念理解 排他网关&#xff0c;也称为异或(XOR)网关&#xff0c;用于流程中实现分支决策建模。排他网关需要搭配条件顺序流使用。 当流程流转到排他网关时&#xff0c;所有流程顺序流都是会顺序求解&#xff0c; 其中第一条条件为true的顺序流会被选中(当有多条顺序流都…

澳汰尔(Altair)3D 打印部件设计仿真——打造高效的增材制造设计

借助 Inspire Print3D&#xff0c;可加速创新、结构高效的 3D 打印部件的创建、优化和研究&#xff0c;提供快速准确的工具集&#xff0c;可用于实现选择性激光熔融 (SLM) 部件的设计和过程仿真。 工程师可以快速了解影响可制造性的工艺或设计变更&#xff0c;然后将部件和支撑…

SoC设计更重要的是IP管理

对于大多数片上系统&#xff08;SoC&#xff09;设计来说&#xff0c;最关键的任务不是RTL编码&#xff0c;甚至不是创建芯片架构。今天&#xff0c;SoC的设计主要使用来自多个供应商的各种IP块。这使得管理硅IP成为SoC设计过程中的主要任务。 一般来说&#xff0c;新编写的RTL…

Swift Combine — JUST Publisher

之前文章介绍的Publisher都是可以连续发送数据的&#xff0c;Subscriber也可以一直接收数据&#xff0c;除非收到了finished或者error而结束。而JUST Publisher则不同&#xff0c;它只向每个订阅者发送一次输出&#xff0c;然后结束。 一起来看一下下面的代码。 class JustVi…

从0到1:手动测试迈向自动化——手机web应用的自动化测试工具

引言&#xff1a; 在当今移动互联网时代&#xff0c;手机web应用已经成为人们生活中不可或缺的一部分。为了保证手机web应用的质量和稳定性&#xff0c;自动化测试工具变得十分重要。本文将介绍手机web应用自动化测试工具的选择和使用&#xff0c;提供一份超详细且规范的指南&a…

GPT3.5的PPO目标函数怎么来的:From PPO to PPO-ptx

给定当前优化的大模型 π \pi π&#xff0c;以及SFT模型 π S F T \pi_{SFT} πSFT​ 原始优化目标为: max ⁡ E ( s , a ) ∼ R L [ π ( s , a ) π S F T ( s , a ) A π S F T ( s , a ) ] \max E_{(s,a)\sim RL}[\frac{\pi(s,a)}{\pi_{SFT}(s,a)}A^{\pi_{SFT}}(s,a)] m…

重构大学数学基础_week05_雅各比矩阵与雅各比行列式

这周来讲一下雅各比矩阵和雅各比行列式。 多元函数的局部线性属性 首先我们来回顾一下向量函数&#xff0c;就是我们输入一个向量&#xff0c;输出也是一个向量&#xff0c;我们假设现在有一个向量函数 这个函数意思就是在说&#xff0c;我们在原来的平面上有一个向量(x,y),经…