【JVM】JMM

文章目录

  • 前置的硬件知识
  • 什么是JMM
  • JMM的三大特性
  • JMM中定义的原子操作
  • happens-before先行发生原则

前置的硬件知识

硬件存储体系:
在这里插入图片描述
运行速度从上到下依次减慢.

由于CPU计算速度远超与内存的处理速度,所以CPU不会直接从内存中读写,而是将内存中的变量拷贝一份副本放到CPU高速缓存中,缓解主存储器和CPU速度不匹配的瓶颈.但这样就导致了内存的读和写操作的时候会出现不一致的问题,即缓存一致性问题.

什么是JMM

JMM(Java内存模型,即Java Memory Model),本身并不是一个真实存在的模型,只是一种抽象的概念,仅仅描述的是一组约定或者规范,通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问形式,并决定了一个线程对共享变量何时写入以及何时对其他线程可见,关键技术点都是围绕多线程的原子性,可见性有序性展开的.

  1. JMM实现了线程和主内存之间的抽象关系.
  2. JMM也屏蔽了各个硬件平台和操作系统的内存访问差异,以实现Java程序在各种平台下都能达到一致性访问的效果.
    在这里插入图片描述
    由于JVM运行程序的实体是线程,而 每个线程创建时JVM都会为其创建一个工作内存(有些地方成为栈空间) ,工作内存是每个线程 私有的数据区域,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有的线程都可以访问,但线程对变量的操作(读或者写)必须在工作内存中进行,首先要将变量从主内存拷贝到线程自己的工作内存空间,然后对变量进行操作,操作完成之后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝,因此不同的线程之间无法访问对方的工作内存,线程之间的通信(传值)必须通过主内存来完成.
    这里所说的主内存和工作内存与java内存的java堆、栈、方法区等并不是同一层次的内存划分。如果要比较的话,那么主内存主要对应于java堆中对象实例数据部分,而工作内存则对应虚拟机栈中的那部分区域。从更低的层次来说,主内存就是硬件的内存,而为了获取更好的有运行速度,虚拟机及硬件系统,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。

JMM的三大特性

  1. 原子性
    指一个操作是不可分割的、完整的要么全部执行成功,要么全部不执行,不存在执行一半的情况。在多线程环境下,如果一个操作不是原子性的,那么可能会发生竞态条件race condition)等问题,导致程序出现不可预期的错误。为了保证原子性,可以使用synchronized关键字或者使用Atomic类中提供的原子操作

  2. 有序性
    什么是指令重排序
    对于一个线程的执行代码而言,我们总是习惯性地认为代码的执行是从上到下,有序执行.但是为了提高性能,编译器和处理器通常会对指令序列进行重新排序.Java固定JVM线程内部维持顺序化语义,即只要程序的最终结果与他顺序化执行的结果相等,那么指令的执行顺序可以与代码的顺序不一致,此过程叫做指令重排序.

  • 优点:
    JVM能根据处理器特性(CPU多级缓存系统,多核处理器)适当的对机器指令进行重排序,使机器指令能更符合CPU的执行特性,最大限度的发挥机器性能.
  • 缺点
    指令重排序只能保证串行语义一致,但没义务保证多线程之间的语义也一致.所以在多线程的情况下会产生"脏读"
  1. 可见性
  • 可见性是指一个线程对共享变量的修改其他线程能够及时看到这些修改JMM 通过内存屏障volatile 关键字同步机制(如 synchronizedLock)来确保可见性
  • 一个线程修改了一个变量并释放了锁其他线程在获取该锁后能够看到这个变量的最新值

JMM中定义的原子操作

JMM内存模型中定义的8种每个线程自己的工作内存与主物理内存之间的原子操作

read(读取)->load(加载)->use(使用)->assign(赋值)->store(存储)->write(写入)->lock(锁 定)->unlock(解锁)
在这里插入图片描述

  • read:作用于主内存,将变量的值从主内存传输到工作内存,主内存到工作内存
  • load:作用于工作内存,将read从主内存传输的变量值放入工作内存变量副本中,即数据加载
  • use:作用于工作内存,将工作内存的变量副本的值传递给执行引擎,每当JVM遇到需要该变量的字节码指令时会执行该操作
  • assign:作用于工作内存,将从执行引擎接收到的值赋值给工作内存变量,每当JVM遇到一个给变量赋值字节码指令时会执行该操作
  • store:作用于工作内存,将赋值完毕的工作变量的值写回主内存
  • write:作用于主内存,将store传输过来的变量值赋值给主内存中的变量
  • lock:作用于主内存,将一个变量标记为一个线程独占的状态,只是写时加锁,就只是锁了向主内存写入变量的过程;
  • unlock:作用于主内存,把一个处于锁定状态的变量释放,然后才能被其他线程占用

happens-before先行发生原则

Happens-Before(先行发生)原则是对Java内存模型(JMM)中所规定的可见性的更高级的语言层面的描述。用这个原则解决并发环境下两个操作之间的可见性问题,而不需要陷入Java内存模型苦涩难懂的定义中

注意:Happens-Before原则其实就是指第一个操作A的执行结果对第二个操作B的执行结果可见,而且第一个操作的执行顺序排在第二个操作之前.
但是两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则指定的顺序执行,如果重排序之后的执行结果按照happens-before关系来执行的结果一致,那么这种重排序并不违法.

  • 次序规则:在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作。
  • 管道锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。
  • volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作
  • 传递规则:如果操作A先行发生于操作B操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。
  • 线程启动规则:Thread对象start()方法先行发生于此线程的每一个动作。
  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。
  • 线程终止规则:线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法和Thread.isAlive()的返回值等手段检测线程是否已经终止执行。
  • 对象终结规则:一个对象的初始化完成(构造函数结束)先行发生于它的finalize()方法的开始。

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

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

相关文章

2022年下真题(案例分析)

一、数据流图 二、数据库设计 - ER图 三、面向对象设计 - 用例图、类图 四、算法

【人工智能】AI人工智能的重要组成部分,深入解析CNN与RNN两种神经网络的异同与应用场景和区别

文章目录 一、卷积神经网络(CNN)详解1. 特征与结构CNN的基本结构 2. 应用场景3. 代码示例 二、循环神经网络(RNN)详解1. 网络结构与特点RNN的基本结构 2. 应用场景3. 代码示例 三、CNN与RNN的异同点1. 相同点2. 不同点 四、CNN与R…

基于YOLOv8-deepsort算法的智能车辆目标检测车辆跟踪和车辆计数

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

Vue使用@别名替换后端ip地址

1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后,就可以导入nodejs的 path模块,在下面代码 import path…

闪电麦昆 语音控制齿轮行进轨迹,ESP32搭配语音控制板,串口通信,附视频演示地址

演示地址 https://www.bilibili.com/video/BV1cW421d79L/?vd_sourceb8515e53f6d4c564b541d98dcc9df990 语音控制板的配置 web展示页面 esp32 程序 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <LittleFS.h> #include <WebSo…

STL之set、map的使用

STL之set、map 1. 序列式容器和关联式容器2. set系列的使⽤参考文档链接&#xff1a;2.1 set的介绍&#xff08;2&#xff09;set的增删查2.2 multiset的介绍 3 map3.1 参考文档3.2 map类的介绍3.3 pair类型介绍3.4 map的构造3.6 map的数据修改3.7 multimap和map的差异 1. 序列…

openpdf

1、简介 2、示例 2.1 引入依赖 <dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.34</version></dependency><dependency><groupId>com.github.librepdf</…

python+yaml+pytest+allure接口自动化框架

建议想学自动化的同学&#xff0c;先花半个月一个月的时间&#xff0c;去b站极限学习一下有关python的基础内容&#xff0c;比如各种数据类型的特点&#xff0c;创建 转换等&#xff0c;还有面向对象的一些知识&#xff0c;否则直接看自动化框架&#xff0c;很难看懂理解&#…

根据请求错误的状态码判断代理配置问题

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

2024顶级一区idea:多模态图像融合!

在图像处理的前沿领域&#xff0c;多模态图像融合技术正成为研究的热点&#xff0c;它通过整合来自不同来源的图像数据&#xff0c;为我们提供了更丰富的信息维度&#xff0c;从而显著提升图像处理的精确度和效率。 这项技术的核心优势在于能够捕捉并融合各种图像数据中的互补…

3D渲图软件推荐:打造高质量渲染效果

在现代设计领域&#xff0c;3D渲图已经成为展示设计方案和产品外观的重要手段。无论是建筑设计、产品设计还是影视动画&#xff0c;都需要借助专业的3D渲染图软件来实现逼真的视觉效果。 本文将为您介绍几款备受好评的3D渲染图软件&#xff0c;帮助您在项目中选择合适的工具。…

户外防火值守:太阳能语音监控杆的参数及技术特点

随着假期旅游的热潮日渐高涨&#xff0c;我们游览各大景区、公园或森林区域时&#xff0c;经常会与各种智能设备不期而遇。这些高科技产品不仅提升了旅游体验&#xff0c;更在无形中保障了游客的安全与景区的环境保护。在我最近的旅行经历中&#xff0c;尤其是在深圳大鹏旅游景…

开放式蓝牙耳机排行榜10强?分享值得安利的开放式耳机

​开放式耳机目前非常流行&#xff0c;它们以时尚、美观和舒适著称&#xff0c;迅速赢得了众多用户的喜爱&#xff0c;成为了耳机市场的新宠。与传统的入耳式耳机相比&#xff0c;开放式耳机佩戴更稳固&#xff0c;对耳朵也更为温和。尽管有些人认为它们价格不菲&#xff0c;甚…

项目_C_Ncurses_Flappy bird小游戏

Ncurses库 概述 什么是Ncurses库&#xff1a; Ncurses是一个管理应用程序在字符终端显示的函数库&#xff0c;库中提供了创建窗口界面、移动光标、产生颜色、处理键盘按键等功能。 安装Ncurses库&#xff1a; sudo apt-get install libncurses5-dev 头文件与编译&#xf…

Springboot自定义starter注入到第三方项目IOC容器里

一 Bean扫描 Springboot项目&#xff0c;我们不加ComponentScan注解&#xff0c;但是也能扫描到Controller、Service标记的类&#xff0c;为什么呢&#xff1f;关键在于启动类的SpringBootApplication注解&#xff0c;该注解由以下三个注解组成&#xff1a; SpringBootConfig…

关于BSV区块链覆盖网络的常见问题解答(下篇)

​​发表时间&#xff1a;2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分&#xff0c;覆盖网络服务提供了一个强大的框架&#xff0c;用于管理特定类型的交易和数据访问…

如何将 html 渲染后的节点传递给后端?

问题 现在我有一个动态的 html 节点&#xff0c;我想用 vue 渲染后&#xff0c;传递给后端保存 思路 本来想给html的&#xff0c;发现样式是个问题 在一个是打印成pdf&#xff0c;然后上传&#xff0c;这个操作就变多了 最后的思路是通过 html2canvas 转化成 canvas 然后变成…

XUbuntu安装OpenSSH远程连接服务器

目录 打开终端。更新你的包索引安装OpenSSH服务器。在终端中输入以下命令&#xff1a;安装完成后&#xff0c;OpenSSH服务器会自动启动。查看主机 IP测试连接打开 cmd 终端SSH 连接虚拟机确认连接输入连接密码发现问题修改用户&#xff0c;尝试连接 打开终端。 更新你的包索引 …

在 Android 上恢复已删除文件的 5 种简单方法

您可能会因为意外删除、未完成的 Android 更新、手机意外关机等原因而丢失 Android 上的重要数据。新技术的发展使许多手机功能或程序能够从内部恢复丢失的数据。 在 Android 上恢复已删除文件的 5 种简单方法 然而恢复成功率的不确定性也成为人们克服数据丢失困境的重要考虑因…

安卓13禁止锁屏 关闭锁屏 android13禁止锁屏 关闭锁屏

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 设置 =》安全 =》屏幕锁定 =》 无。 我们通过修改系统屏幕锁定配置,来达到设置屏幕不锁屏的配置。像网上好多文章都只写了在哪里改,改什么东西,但是实际上并未写明为什么要改那…