JAVA内存模型(JMM)

求助:有没有基于pscad的锂电池仿真模型 求助:有没有基于pscad的锂电池仿真模型 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变没有 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写... 阅读详情

java内存模型:

		java虚拟机规范中定义的java内存模型(JMM)是为了 屏蔽各种操作系统 ,硬件等内存的访问差异,以确保Java程序在所有操作系统和平台上能够实现一次编写、到处运行的效果。
		理解java内存模型是学习java并发的基础,JMM定义了java中多线程对共享变量操作的定义
主内存
	  java虚拟机规范规定所有的共享变量存储在主内存中
工作内存
每个线程有自己的独立内存空间--工作内存;

每个线程不能直接操作主内存中的变量,只能从主内存copy到自己的工作内存空间进行操作,然后写入到主内存空间; 各个线程是不可见的数据不共享的, 线程之间的通信需要通过主内存进行交互;所以在多线程进行操作的时候就会出现数据一致性问题

工作内存和主内存交互协议

Java内存模型
lock(锁定):作用于主内存变量,锁定变量为线程独占状态
unlock(解锁): 作用于主内存变量,解锁线程锁定的变量,供其他线程使用
read(读取):作用于主内存变量,把一个变量的值从主内存中传输到线程工作内存中,以便随后的load操作
load(载入): 作用于工作内存变量,把从主内存中读取到的值保存到工作内存的变量副本中
use(使用): 作用于工作内存变量,把工作内存中的变量值传递给执行引擎,每当虚拟机需要使用这个变量的时候,就会执行该操作
assign(赋值):作用于工作内存中的变量,把从执行引擎中获取到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的指令的时候会执行该操作
store(存储):作用于工作内存变量,把工作内存中变量的值传递给主内存,以便后续的write操作
write(写入):作用于主内存变量,把store操作过来的值写入到主内存变量中

这8个步骤必须符合的规则
  1. 不允许read和load、store和write操作之一单独出现,以上两个操作必须按顺序执行,但没有保证必须连续执行,也就是说,read与load之间、store与write之间是可插入其他指令的。
  2. 不允许一个线程丢弃它的最近的assign操作,即变量在工作内存中改变了之后必须把该变化同步回主内存
  3. 一个新的变量只允许在主内存中诞生,不允许工作内存直接使用未初始化的变量
  4. 不允许一个线程回写没有修改的变量到主内存,也就是如果线程工作内存中变量没有发生过任何assign操作,是不允许将该变量的值回写到主内存
  5. 一个变量在同一时刻只能被一个线程进行lock操作,加锁后其他线程不能对该变量进行lock操作,只能等待解锁unlock后其他线程才能操作;但是同一线程对该变量能进行多次lock操作,不过也要相应执行多次的unlock
  6. 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值。
  7. 不允许对没有lock的变量执行unlock操作,如果一个变量没有被lock操作,那也不能对其执行unlock操作,当然一个线程也不能对被其他线程lock的变量执行unlock操作
  8. 对一个变量进行unlock操作的时候,必须把变量值同步回主内存
原子性,可见性 和有序性
  • 原子性:操作是不可中断的,要么成功要么失败;java内存模型中定义了8种操作都是原子操作,不可再分的;
    由Java内存模型来直接保证的原子性变量 操作包括read、load、assign、use、store和write,我们大致可以认为基本数据类型的访问读写是具备原子性的。如果应用场景需要一个更大方位的原子性保证,Java内存模型还提供了lock和unlock操作来满足这种需求,尽管虚拟机未把lock和unlock操作直接开放给用户使用,但是却提供了更高层次的字节码指令monitorenter和monitorexit来隐式的使用这两个操作,这两个字节码指令反应到Java代码中就是同步块–synchronized关键字,因此在synchronized块之间的操作也具备原子性。
    所以可以这么说JMM中定义的 read,load,assign,use,stoe,write都是原子性操作,lock和unlock是为了在多线程情况下保证原子性
  • 可见性:可见性是指当一个线程修改了变量的值,其他线程能够立即感知到;变量值修改后刷新会主内存,使用变量的值时从主内存刷新回工作内存;volatile修饰的变量在操作的时候是具备可见性的,除了volatile之外,Java还有两个关键字能实现可见性,即synchronized和final;而final关键字的可见性是指:被final修饰的字段在构造器中一旦初始化完成,其他字段就能看见

final字段的值,也就是final域能确保初始化过程的安全性。

  • 有序性:单线程中所有的操作都是有序的;如果在多线程环境下,一个线程观察其他线程的操作都是无序的;前半句是指“线程内表现为串行的语义”,后半句是指“指令重排序”现象和“工作内存与主内存同步延迟”现象; 也可以这么说 单线程中不存在有序和无序,只有在多线程环境下多个线程操作顺序是乱序的

这里引入一个指令重排序的概念; 编译器在不改变程序的语义的情况下对代码指令进行重排序;
在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。例如:

	int a = 10;
	int b = 20;

这样的操作 可能会先加载 int b = 20; 两个变量的加载顺序是不关联的

	int a = 10;
	int b = a;	

这样的操作是和顺序由关联的 必须先加载a, 在加载 b

再看下面代码

// 定义两个变量
int a = 0;
boolean flag = false;
public void opration1() {
	a = 2;                     // 1
	flag = true;               // 2
}
public void opration2() {
	if (flag) {                // 3
		System.out.print(a * a);//4
	}
}

现在假设有两个线程,一个线程调用了opration1 方法, 一个线程调用了opration2 方法, 由于指令重排序 线程1 可能是这么执行的

flag = true;  // 先执行了flag = true 并写入了主内存
a = 2;        

然后这个时候 线程而开始执行了,线程2 获取到的flag = true, a = 0;(线程1 的a赋值操作还没写入到主内存) 所以会输出 0 ;

再看一个经典的单例问题, 双重检测机制

//常见的 线程安全的单例模式
public class TestA {
   
   private TestA(){}
   
   public static TestA ta = null;
   
   public static TestA getInstance() {
       if (ta == null) {
           synchronized (TestA.class) {
               if (ta == null) {
                   ta = new TestA();
               }
           }
       }
       return ta;
   }
}

但是他一定安全吗/
ta = new TestA();
这里会做三步操作;

  1. 开辟内存空间,分配内存空间
  2. 初始化对象信息
  3. 句柄引用指向内存空间
    在指令重排序的作用下 原本 1-2-3 的操作 可能会变成1-3-2 也就是分配空间后并没有初始化就进行了 对象的引用指向操作,
    所以这个 单例模式 在极小的概率下并不是安全的
IPMItool 控制风扇转速 然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。 阅读详情

相关推荐

DM9000有线网卡驱动编写

DM9000有线网卡驱动编写 1.DM9000简介   DM9000 是一款完全集成的、性价比高、引脚数少、带有通用处理器接口的单芯片快速以太网控制器。 自 带一个 10/100M PHY 和 4K 双字的 SRAM ,DM9000A 为适应各种处理器提供了 8 位、16 位数据接口访问 内部存储器,DM9000 拥有自动协商功能,DM9000 特性如下:   1.集成自适应 10/100M 收发器。   2.内置 16k 字节的 SRAM。   3.支持硬件帧校验。   4.兼容 3.3V 和 5.0V

weixin_44453694的博客 4672

Java内存模型(JMM)详解

在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型。它们的答案是一致的:能够让我们更好的理解底层原理,写出更高效的代码。 就Java内存模型而言,它是深入了解Java并发编程的先决条件。对于后续多线程中的线程安全、同步异步处理等更是大有裨益。 硬件内存架构 在学习Java内存模型之前,先...

程序新视界 2252

KUKA机器人编程实战:5分钟搞定组输入与组输出的信号配置(附代码示例)

本文详细介绍了KUKA机器人编程中组输入与组输出的信号配置方法,通过5分钟快速掌握核心技巧。文章包含信号声明语法、典型配置流程及高级应用技巧,并附有代码示例,帮助工程师高效实现机器人与外部设备的通信。

efc123456的博客 850

java内存模型jmm_Java内存模型JMM详细解析

欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。在共享内存 并发模型中,线程之间的通信是通过共享程序的公共状态,对公共状态进行写-读内存进行隐式通信,类似于下面这样: 在消息传递的并发模型中,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信,类似于下面这样: 理解了上面的并发模型之后,需要知道的是Java并发模型采用的是共享内存的模型,线程之间的通信是隐式的。因...

weixin_42297982的博客 347

NVIDIA 2025 Board Design Engineer 校招笔试

电路分析,矩形波阶跃反馈驱动​,误差信号。非常简单,数电or​离散基础。第一题是考试规矩知情确认。大二暑假做的,纯体验​。五六题太长,下篇分享。

m0_74253823的博客 1124

诠视MR眼镜Unity开发设置_Unity2020.3.38

请按照如下设置Android SDK 和 Gradle。打包前先将Unity切换到Android模式。Preferences 设置。

m0_71932574的博客 599

浅析java内存模型--JMM(Java Memory Model)

在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步?  在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的。  线程之间通过共享程序公共的状态,通过读-写内存中公共状态的方式来进行隐式的通信。同步指的是程序在控制多个线程之间执行程序的相对顺序的机制,在共享内存模型中,同步是显式的,程序员必须显式指定某个方法/...

weixin_33910460的博客 161

平面变压器PCB绕组设计实战:从原理到布局的工程考量

本文深入探讨了平面变压器PCB绕组设计的工程实践,从基础原理到布局优化,涵盖了电流密度、层间绝缘、绕组拓扑结构等关键参数。通过实战案例分享,解析了高频应用中的集肤效应、邻近效应等挑战,并提供了热管理和EMC优化的实用技巧,助力工程师在服务器电源、车载充电器等空间敏感场景实现高效设计。

weixin_42666036的博客 452

Java内存模型——JMM总结

JMM是什么? 是一种规范,是关键字和工具类的原理,各JVM的实现都需要遵循它 JVM内存结构 VS Java内存模型 VS Java对象模型【自己过】 为什么需要JMM? ◇ 运算依赖处理器,不同处理器结果可能不一样 ◇ 无法保证并发安全 ◇ 需要一个标准,让多线程的结果可预期 ◇ C语言不存在内存模型概念 JMM最重要的三点内容 可见性 { 为什么会有可见性问题? CPU有多级缓存,导致读的数据过期 每个核心都会将需要的数据读到独立缓存中 数据修改后也是先写入到缓存中,再等待时机flush到主存

Jaychan的博客 238

stm32H743IIT6 cubemx HAL USB UVC摄像头基础

stm32性能已经很强了, 可以驱动ov5640摄像头, 所以可以把摄像头接在stm32上, 当作一个摄像头驱动器, 连接到电脑上 开发环境: stm32cubemx 6.0.1 单片机: 自己做的stm32h743iit6核心板,兼容正点原子 学习资料: 圈圈学USB 鱼鹰谈单片机 从零开始学习USBhttps://to-run-away.blog.youkuaiyun.com/article/details/85038393 整个项目是基于CDC串口上修改 1 stm32 USB 代码概览 ..

紫枫洛天的博客 7748

详解AXI4-Lite接口(3)--AXI4-Lite接口IP源码仿真及分析(Master接口)

通过本文您会学到:1、了解AXI4-Lite_Master接口的逻辑实现;2、加深Xilinx IP、仿真工具的使用;3、提高阅读时序图的能力。

孤独的单刀 6445

jmm内存模型_5 分钟给你讲明白JVM内存结构 和 Java内存模型 和 Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的 JVM内存结构 、 Java内存模型 和 J ava对象模型 ,这就是三个截然不同的概念,但是很多人容易弄混。可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、Java内存模型和Java对象模型这三者的概念及其间的区别。甚至我见过有些面试...

weixin_39971172的博客 163

13、基因相似性度量的相关性及特征选择研究

本文研究了基因相似性度量和特征选择在生物学中的应用,详细介绍了GO术语相似性度量的多种方法,包括语义度量和路径长度度量,并分析了不同方法在酵母和人类数据集上的表现。研究发现,Avg-sum方法和基于路径长度的度量在多数情况下效果较好。此外,通过晚期辐射毒性预测的案例研究,探讨了特征选择的重要性及可能面临的过拟合和噪声干扰问题,并提出了相应的解决策略。

js777的博客 127

Java 内存模型 JMM

Java 内存模型 JMM

26857259 1606

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

聊聊Java内存模型(JMM)

它本身只是一个抽象的概念,并不真实存在,它描述的是一种规则或规范,是和多线程相关的一组规范。通过这组规范,定义了程序中对各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。需要每个JVM 的实现都要遵守这样的规范,有了JMM规范的保障,并发程序运行在不同的虚拟机上时,得到的程序结果才是安全可靠可信赖的。Java内存模型围绕着在并发过程中如何处理这三个特性而建立的模型。

qq_25409421的博客 3万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java内存模型JMM

java内存模型 jmm(java memory model)规范,他规范了java虚拟机与计算机内存如何协调工作 ,他规定了一个线程如何及何时看到其他线程修改过的变量的值,以及在必须时,如何同步的访问共享变量。 jmm内存分配的概念: 堆heap: 优点:运行时数据区,动态分配内存大小,有gc;,缺点:因为要在运行时动态分配,所以存取速度慢,对象存储在堆上,静态类型的变量跟着类的定义一起存储在...

坚定目标,超越自我 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java内存模型(JMM)

Java 内存模型(Java Memory Model),简称JMM。它定义了 Java 程序中的变量、线程如何和主存以及工作内存进行交互的规则。首先需要明白java的运行时数据区,如下图:​方法区:存储了运行时常量池、字段和方法参数、构造方法等字节码数据。堆:几乎所有的对象实例及数组都存在这里。栈:每一个线程有一个私有的栈,用于存储局部变量、栈帧、动态链接、方法出口等。本地方法栈:与栈类似,不过进入本地方法栈的数据需要通过native关键字表明。

xct5201314的博客 1757

Java 内存模型(JMM)

在面试中,Java 内存模型(Java Memory Model, JMM)是一个常见且重要的主题。然而,很多开发者容易将 JMM 与 Java 运行时内存区域混淆。本文将详细解释 JMM 的概念,并对比它与 Java 运行时内存区域的区别。

专注Java和MySQL领域知识分享 1055

Java内存模型JMM

计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存,到CPU。 一般对于的程序的操作就是从数据库查数据到内存然后到CPU进行计算因为有这么多级的缓存(cpu和物理主内存的速度是不一致的) CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题JVM规范中试图定义一种Java内存模型(Java Memory Model,简称 JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM本

Lifelong learning 4032

【JMM】Java 内存模型

本期内容主要介绍JMM,Java内存模型。

爱编程爱运动的博客 4296

Java内存模型(JMM)深度解析

Java内存模型(JMM)是Java并发编程的核心规范,定义了多线程环境下变量访问规则和线程交互机制。JMM采用主内存与线程工作内存的抽象模型,通过8种原子操作控制内存交互,并建立happens-before原则保证操作顺序性。文章详细解析了内存屏障的实现差异、final字段的特殊规则、双重检查锁定的解决方案,以及JMM与硬件内存模型的关系。同时提供了可见性问题、指令重排序等常见并发问题的分析,并给出安全发布模式和性能优化建议。理解JMM是编写正确高效并发程序的关键,它既保证了线程安全,又为JVM优化提供了

weixin_47242663的博客 1271

JMM(Java内存模型)详解

为了对上面的问题进行更深入的探究,我有查了一些JIT相关的资料。简单总结下JIT然后再对上面的问题分析下。JIT(Just-In-Time)编译器是Java虚拟机(JVM)中的一个关键组件,它负责在程序运行过程中动态地将字节码(即Java编译后的.class文件中的代码)转换为特定于平台的机器代码。这一过程旨在提高程序的执行效率,因为它能够针对运行时的数据和实际使用模式进行优化,而不仅仅是基于静态代码分析。JIT工作原理加载与解释执行:当Java程序启动时,JVM首先加载类文件并由解释器执行字节码。

落日的博客 4170

jmm-java内存模型

JMM-java内存模型

Java学习 1248

揭秘Java内存模型(JMM)

简单来说,Java内存模型(JMM)是Java虚拟机(JVM)规范中定义的一种。

guangzhi0633的专栏 1121

Java内存模型之JMM

现代计算机系统中,CPU的运行并不直接操作主内存,而是通过将主内存中的数据加载到处理器的高速缓存中进行快速访问和运算。这种设计可以加快数据访问速度,提高计算效率。然而在多核处理器系统中,每个处理器核心都拥有自己的高速缓存,而它们又需要共享同一块主内存。当多个处理器核心同时对同一内存区域进行操作时,由于各自的高速缓存可能包含不一致的数据,就会出现数据一致性的问题。为了解决这个问题,就需要制定一套缓存一致性协议,确保各个处理器核心在操作缓存时能够遵守协议,从而保证数据不会出现混乱的情况。

weixin_54225397的博客 963

Java内存模型(JMM)详解

Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。

EverythingAtOnce的博客 1995
上一篇: markdown编辑器介绍(.md 文件编写)
下一篇: java线程基础
xiaoduup
博客等级 码龄9年 23粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值