【JVM】JMM

news2025/1/24 22:39:46

一、JMM

  • JVM 内存模型是用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各个平台下都能达到一致的内存访问效果。
  • JVM 内存模型规定了所有的共享变量都是存储在主内存,每个线程还有自己的工作内存,线程的工作内存保存了该线程使用到的共享变量的主内存副本拷贝,线程对变量的操作都必须在工作内存中进行,而不能直接读写主内存中的变量,不同的线程之间也无法直接访问对方工作内存中的数据,线程间变量值的传递均需要主内存来完成。
  • JMM(Java Memory Model)Java内存模型,是一个抽象概念,定义了多线程访问共享变量的方式。
  • 每个 JVM 的实现都要遵守JMM,保障并发程序运行在不同的JVM得到一致性的程序结果。
  • JMM 与处理器、缓存、并发、编译器有关。解决了 CPU 多级缓存、处理器优化、指令重排等导致的结果不可预期问题,保证并发语义关键字的实现效果。
  • JMM 最重要的三点内容:重排序、原子性、内存可见性。

1. 缓存一致性

  • CPU读写速率高,需要通过 高速缓存 实现和主存(物理内存)交互。
  • 多核心CPU,每个处理器都有自己的高速缓存,而它们又共享同一个主内存,可能导致各自缓存数据不一致的问题。
  • 为了解决缓存一致性问题,制定了缓存一致性协议。

2. Java内存模型(JMM)

  • JMM规定所有变量都存储在主内存中,每条线程还有自己的工作内存。
  • 线程的工作内存中保存了被线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的数据。
  • 不同线程之间也无法直接访问对方的工作内存中的变量,线程间变量值的传递需要通过主内存来完成。 也就是说Java线程之间的通信采用的是共享内存。
    在这里插入图片描述
  • Java内存模型与Java内存区域并不是同一个层次对内存的划分,可以说两者并没有什么关系。
    JMM与Java内存区域唯一相似点,都存在共享数据区域和私有数据区域。
    在JMM中主内存属于共享数据区域,对应堆和方法区。工作内存数据线程私有数据区域,对应程序计数器、虚拟机栈以及本地方法栈。

3. happens-before原则(先行发生原则):

JMM供了happens-before 原则来辅助保证程序执行的原子性、可见性以及有序性的问题,它是判断数据是否存在竞争、线程是否安全的依据:

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
  • 锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C
  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作
  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行
  • 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始


参考:
https://mp.weixin.qq.com/s?__biz=MzkzMDI1NjcyOQ==&mid=2247487735&idx=1&sn=96bb492a25ad7ff1875cdf649c9ab611&source=41#wechat_redirect

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

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

相关文章

【教学类-34-01】拼图(运动项目)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)

背景需求: 一个月的Python纸类学具研究中,我发现个别男孩喜欢把作业中的数字、图案、单元格剪成小块(小卡片)进几周,剪条、剪块的孩子人数也慢慢递增。 幼儿需求:锻炼手指精细动作的需求、或者获得更多物…

Idea+maven+spring-cloud项目搭建系列--13 整合MyBatis-Plus多数据源dynamic-datasource

前言:对于同一个系统,不同的租户需要自己独立分隔的数据库(每个数据库的表结构可以是相同的),同时也要支持跨数据源的查询;并且支持分布式事务,如果这里不使用分库分表插件,需要怎样…

python-day4(字符串、列表、生成式和生成器、使用元组、集合、字典)

字符串和常用数据结构 简单用法 所谓字符串&#xff0c;就是由零个或多个字符组成的有限序列&#xff0c;一半记为sa1a2a3…an(0<n<∞)。在python中&#xff0c;如果我们把单个或多个字符用单引号或者双引号包围起来&#xff0c;就可以表示一个字符串。 s1 hello, wo…

【生物信息】用隐马尔可夫模型对生物序列进行建模

文章目录 Modeling biological sequences with HMMSParsing longer sequences. 举例子Our frst HMM: Detecting GC-rich regionsRunning the model: Probability of a sequence 维特比算法 Viterbi一个摸球例子回到课堂 求解参数 来自Manolis Kellis教授的课 教了隐马尔可夫在基…

FPGA开发之HDMI Transmitter接口设计

HDMI简介&#xff1a; High Definition Multimedia 高清多媒体接口&#xff0c;一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号 物理接口&#xff1a; 电气介绍&#xff1a; TMDS&#xff08;Transition Minimized Differential Signaling&#x…

自定义类型——位段

什么是位段&#xff1f; 位段又叫做位域&#xff0c;具体是一种可以把数据以位的形式紧凑的存储&#xff0c;并允许程序员对此结构位进行操作的数据结构 当结构体的成员变量定义之后浪费了较大的空间 &#xff08;比如int a 2&#xff0c;则浪费了30个比特位的空间&#xff0…

Mail 服务器

Mail 服务器 1. 概念及协议2. 工具2.1 Postfix2.2 dovecot2.3 bind 3. 搭建3.1 DNS服务设置3.2 安装配置 postfix3.3 安装配置 dovecot 4. foxmail验证 1. 概念及协议 邮件服务器也采用的是C/S工作模式&#xff0c;通过SMTP,POP,IMAP协议来是实现邮件的发送和接收的。 SMTP 的…

Java入坑之IO操作

目录 一、IO流的概念 二、字节流 2.1InputStream的方法 2.2Outputstream的方法 2.3资源对象的关闭&#xff1a; 2.4transferTo()方法 2.5readAllBytes() 方法 2.6BufferedReader 和 InputStreamReader 2.7BufferedWriter 和 OutputStreamWriter 三、路径&#xff1a;…

Qt5 编译QtXlsx并添加为模块[Windows]

00.QtXlsx是什么&#xff1f;能干什么&#xff1f; QtXlsx是一个可以读写Excel文件的库。它不需要Microsoft Excel&#xff0c;可以在Qt5支持的任何平台上使用。 可以创建、读取、编辑.xlsx文件。 01.如何编译&#xff1f; 1.1编译环境&#xff1a; Windows10平台&#xff1b;…

es6笔记-let、const、var的区别

let、const、var的区别 变量提升 var 声明的变量存在变量提升,在声明前可以调用&#xff0c;直为undefindconsole.log(a); var a 1;相当于&#xff1a;var a; console.log(a); a 1;let和const不存在变量提升&#xff0c;变量要在声明前调用&#xff0c;否则报错console.log(a…

DNS服务器配置

一&#xff0c;正向解析 1>安装软件bind 提供DNS服务的软件叫bind&#xff0c;服务名是named [rootserver ~]# yum install bind -y 2>对三个配置文件进行修改 - /etc/named.conf : 主配置文件&#xff0c;共59行&#xff0c;去除注释和空行之和有效行数仅30行左右&…

Golang程序报错:fatal error: all goroutines are asleep - deadlock

文章目录 1.原始代码2.错误原因分析3. 解决方案4. 经验总结5. 练习 完整的报错信息如下&#xff1a; fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]: main.(*WorkerManager).KeepAlive(0xc000088f60)/root/go_workspace/studygoup/05.go:66 0…

Doris(7):数据导入(Load)之Routine Load

例行导入功能为用户提供了义中自动从指定数据源进行数据导入的功能 1 适用场景 当前仅支持kafka系统进行例行导入。 2 使用限制 支持无认证的 Kafka 访问&#xff0c;以及通过 SSL 方式认证的 Kafka 集群。支持的消息格式为 csv 文本格式。每一个 message 为一行&#xff0c;…

【Cpp】手撕搜索二叉树(K模型)

文章目录 二叉搜索树概念详解二叉搜索树的概念二叉搜索树的操作(大致思路)二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除(最重点) 手撕搜索二叉树代码结点定义(以key型为例,KV型将在下一篇博客中介绍)树结构定义深拷贝构造函数与构造函数赋值重载析构函数遍历(结果按从小到…

软件测试的当下分析

在没有清晰能见度的情况下驾驶汽车不仅非常危险&#xff0c;也十分鲁莽。这会让我们和我们周边的人随时面临着碰撞、受伤、甚至死亡的风险。如果不能看到前方的道路&#xff0c;我们就无法预测潜在的危险或障碍&#xff0c;从而无法做出明智的决定并采取适当的行动。 同样&…

什么是ddos攻击?ddos攻击有哪些危害?

一、什么是 DDoS 攻击&#xff1f; DDoS 是 Distributed Denial of Service 的缩写&#xff0c;翻译成中文就是 “分布式拒绝服务”。DDoS 攻击将处于不同位置的多个计算机联合起来作为攻击平台&#xff0c;对一个和多个目标发动 DDoS 攻击&#xff0c;从而成倍提高攻击威力。…

分布式系统概念和设计-进程通信中的(网络API设计)

分布式系统概念和设计 进程间通信 中间件层 请求-应答协议 编码和外部数据表示 因特网协议的API 进程间通信的特征 一对进程间进行消息传递需要两个消息通信操作的支持&#xff08;send和receive&#xff09;&#xff0c;用于定义目的地和消息的定义。 为了能够使一个进程能…

煤化工废水除总氮除硬度,矿井水除砷除氟解决方案

随着环保标准的提升&#xff0c;大部分煤矿企业对矿井水要求执行地表三类水标准&#xff0c;氟化物要求小于1mg/l&#xff0c;这类项目存在体量大、氟含量低、水质偏差等特点。 RO工艺制备纯水是煤化工行业生产的一个辅助环节&#xff0c;会产生大量的浓盐水&#xff0c;由于浓…

十五分钟带你学会 Electron

文章目录 什么是 Electron为什么要选择 Electron安装 Electron桌面CSDN实战Electron 基础配置Electron 进程主进程渲染进程主进程与渲染进程的区别主进程与渲染进程的通信 Electron 跨平台问题Electron 部署打包应用程序发布应用程序 Electron 跨端原理总结 什么是 Electron E…

NE555 Motor LED Chaser

文章目录 1.前言2.资料下载 1.前言 这个是从YouTube上搬运来的&#xff0c;如图所示 2.资料下载 所需材料 #1# 10k resistor 1 #2# 10k variable resistor 1 #3# 10uf capacitor 1 #4# 3mm blue led 4 #5# 3mm yellow led 4 #6# 3mm red led 4 #7# 3mm green led 4 #8# 3mm…