JVM详解(5)--JMM

JVM与JMM JVM Java Virtual Machine(Java虚拟机) ​ JVM是 Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 ​ 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多 阅读详情

1.JMM定义
JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规范或规则,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。
2.JMM关于同步的规定:
(1)线程解锁前,必须把共享变量的值刷新回主内存。
(2)线程加锁前,必须读取主内存的最新值到自己的工作内存。
(3)j加锁解锁是同一把锁。
3.线程对共享变量的操作过程
由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存时每个线程的私有数据区域,而Java内存模型规定所有变量存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝到线程自己的工作内存,然后对变量进行操作,操作完成后在将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着内存中的变量副本拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图:
在这里插入图片描述
4.代码实现

public class visibility {
    public static void main(String[] args) {
        Resources resources = new Resources();
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+" is coming!");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            resources.change();
            System.out.println(Thread.currentThread().getName()+" is updating num,num="+resources.num);
        }).start();
        while (resources.num == 10){

        }
        System.out.println(Thread.currentThread().getName()+"is over");
    }
}
class Resources{
    public int num = 10;
    public void change(){
        this.num = 100;
    }
}

在这里插入图片描述
为什么上面的程序没有停止,明明Thread-0修改了num的值,而且还打印了出来,为什么main线程读到的还是10。这是因为涉及到JMM的内存可见性问题,虽然Thread-0在自己的工作内存中修改了num,并把它写入到了主内存,但是Thread-0线程的修改对main线程是不可见的,所以main线程的工作内存中num值还是10。

5.怎么修改呢?
非常简单,共享变量只需用volatile关键字修饰就行。volatile关键字的作用就是每次main线程读取num的时候,都会先把主内存中的num更新到自己的工作内存,那么每次读的num值都是最新的,从而实现了内存可见性。

JVM与JMM深度解析:从Java 8到Java 21的演进 在Java开发者的职业生涯中,理解JVM(Java虚拟机)和JMM(Java内存模型)是进阶的必经之路。无论是日常开发还是面试,这都是绕不开的话题。本文将从实用角度出发,带你深入了解JVM和JMM的核心概念,并对比Java 8、Java 11、Java 17和Java 21各版本的实现差异,帮助大家更好的了解JVM和JMM 阅读详情

相关推荐

JVM 内存、JMM内存与集群机器节点内存的联系

本文深入解析了JVM内存模型与操作系统内存的关联机制。JVM内存由操作系统管理,其堆、方法区、栈等结构对应操作系统的不同内存区域。JMM模型定义了多线程下的内存可见性规则,主内存包含堆和方法区,线程通过工作内存交互。文章详细对比了物理内存、虚拟内存与Swap机制,并给出集群和容器环境下的内存配置建议:JVM堆内存应预留30%空间,避免Swap导致的性能问题。最后总结了常见OOM问题的解决方案,为Java应用的内存分配提供实践指导。

weixin_50055999的博客 1833

Java—JVM和JMM详解

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译,实现了平台无关性。......

m0_38033199的博客 1884

JVM 内存模型与 JMM 内存模型

JVM 内存模型JMM(Java 内存模型)物理内存如何划分逻辑上如何安全访问共享数据关注内存分配和回收关注线程间通信和数据同步解决内存溢出、栈溢出问题解决竞态条件、内存可见性问题一句话总结:JVM 内存模型是“内存怎么用”,JMM是“多线程怎么安全地用内存”。

bentengjiayou的博客 954

JMM和JVM详解

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

weixin_59090531的博客 1197

从CST到AD:高效PCB阵列设计与介质优化实战

本文详细解析了从CST电磁仿真软件到Altium Designer(AD)的PCB阵列设计全流程,重点解决毫米波天线等精密设计中模型导出、介质优化和阵列构建的核心难题。通过实战技巧,指导工程师高效处理DXF文件导入、复杂铜皮填充、空气介质实现等关键步骤,确保高精度设计从仿真到制造的顺利转换,提升工作效率与设计可靠性。

weixin_28256233的博客 439

告别手动拍照!用Python+JAKA机械臂+D455相机实现全自动手眼标定(附完整代码)

本文详细介绍了如何利用Python脚本实现JAKA机械臂与Intel RealSense D455相机的全自动手眼标定流程,提供从硬件配置到代码实现的完整解决方案。通过自动化标定,显著提升工业自动化中的精度和效率,适用于机器人视觉领域的二次开发需求。

weixin_30555125的博客 521

JVM——一文搞懂JMM(Java内存模型)

JVM——一文搞懂JMM(Java虚拟机)

xdx_dili的博客 3199

国标Gb28181里Contact和Route的使用

国标Gb28181是基于Sip协议的,因此对Contact和Route的使用,也可以说是Sip里Contact和Route的使用。Contact和Route则是sip协议里的头字段。 现在,在使用国标Gb28181来做项目时,经常会遇到这种情况,国标的下级是在内网里,上级在公网上。如果不做处理,下级到上级会经过nat协议的转换从而导致上级向下级发送请求时(比如获取目录请求)不能到达

wwyyxx26的专栏 5512

JVM && JMM 专题篇 ( 13000 字详解 )

JVM && JMM 专题,13000 字详解

weixin_73232539的博客 1791

发那科 Fanuc PLC 报文通讯,报文解析。附源程序

发那科 Fanuc PLC 报文通讯,最详细的发那科 PLC报文解析,不再局限在官方提供的库,也不用再局限在windows平台。

ITOfDragon的博客 1747

华为OD机试 - 音乐小说内容重复识别 - 并查集(Java 双机位C卷 200分)

华为OD机试 双机位C卷题库疯狂收录中,刷题。

学Java,找哪吒 159

java中JVM和JMM之间的区别

最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称jmm)和java虚拟机模型(以下简称jvm)之间的关系,下面将详细讲述。 一 jvm结构 jvm的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用。 1 Class Loader(类加载器)就是...

Miracle.Zhao的博客 2万+

遇到一个诡异的WiFi网络问题:同一个办公室苹果电脑上不了网,其他电脑都可以

先来把问题掰开揉碎地看清楚:在一个普通的办公室WiFi网络中,所有设备——Windows电脑、安卓手机、甚至是那台老旧的Linux服务器——都能正常联网,唯独苹果电脑(可能是MacBook、iMac或者Mac mini)像被下了魔咒一样,连不上网。这种情况不仅让人抓狂,还透着一股神秘感。为什么偏偏是苹果电脑?难道WiFi路由器对苹果有“偏见”?这些症状都指向一个核心问题:苹果电脑与办公室WiFi之间,似乎存在某种“沟通障碍”。但这障碍到底出在哪里呢?是苹果电脑自己的问题,还是网络设置在“针对”它?

网络技术联盟站 842

JMM概述

简介什么是JMM内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(Java Memory Model, JMM)。因此它不是对物理内存的规范,而是在虚拟机基础上进行的规范从而实现平台一致性,以达到Java程序能够“一次编写,到处运行

牧竹子 6万+

OpenClaw Windows 安装指南

好的,我来一步一步带你在 Windows 上安装 OpenClaw。

m0_60605453的博客 550

PCB仿真软件:Altium Designer_(6).PCB布线设计:自动布线与手工布线

通过以上步骤,我们完成了一个简单的PCB设计案例。在这个过程中,我们使用了自动布线和手工布线的综合策略,确保布线质量符合设计要求。创建PCB项目:在Altium Designer中创建一个新的PCB项目。导入原理图:将原理图文件导入到PCB项目中。设置布线规则:通过设置必要的布线规则,如线宽、间距等。启动自动布线:使用自动布线器进行初步布线。手工优化布线:通过手工布线工具优化关键信号的布线路径。保存和导出PCB文件:保存PCB文件并导出Gerber文件,用于生产。

kkchenjj的博客 2522

jvm和jmm的区别与联系

@[TOC](JVM和JMM区别与联系 转自yolee is zyl.) 一 JMM JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是java整个计算虚拟模型。 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的副本。 本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以

m0_43396955的博客 749

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【JVM】JMM内存模型

文章目录JVM-内存模型1. 原子性1-1 问题解析1-2 解决方法(1)synchronized(同步关键字)2.可见性2-1 退不出的循环2-2 解决办法(1)volatile(易变关键字)3.有序性3-1 诡异的结果3-2 解决方法3-3 有序性理解3-4 happens-before4.CAS与原子类4-1 CAS4-2 乐观锁与悲观锁4-3 原子操作类5.synchronized 优化5-1 轻量级锁5-2 锁膨胀5-3 重量锁5-4 偏向锁5-5 其他优化(1)减少上锁时间(2)减少锁的粒度(

小皮皮LL的博客 2743

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

扩展知识--jmm和jvm内存模型的区别

本文对比了jvm和java内存模型(jmm)的区别,Java内存模型(JMM)和JVM内存模型虽然名称相似,但它们在概念、目标和作用范围上存在显著区别。JMM是一种规范,旨在解决多线程环境下的并发问题;而JVM内存模型是具体的实现细节,描述了JVM如何管理和分配内存资源。理解这两者的区别对于深入学习Java并发编程和优化内存管理至关重要

Vibugs的博客 1467

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一篇搞懂JVM内存结构与JMM内存优化

在Java编程世界中,Java内存模型(Java Memory Model,简称JMM)和Java虚拟机(Java Virtual Machine,简称JVM)的内存结构是两个核心概念。它们对于理解Java程序的执行方式、性能优化以及并发编程至关重要。尽管这两个概念紧密相连,但它们的职责和特性却各不相同。

2202_75481735的博客 1633

JMM与JVM

JMM与JVM Java是运行在虚拟机上面的,这也是为什么Java能跨平台运行的原因,作为Java程序的底层,了解JVM内存结构就显得很重要了。有一个很常见的误解,JVM内存结构与Java内存模型到底指的是不是同一个东西。其实他们不是同一个东西来的。(以下基于JDK1.8) JVM内存结构指的是一个规范,规范里面规定了JVM内存结构要有类装载子系统、方法区,Java堆,Java栈、线程计数器、本地方法栈、执行引擎。GC垃圾回收器这些东西。而各个不同JDK则是实现了这些规范,他们的Java内存

a13085的博客 594

JVM、GC、JMM学习和整理

本文系统介绍了JVM的核心机制与内存管理。主要内容包括:1)双亲委派机制的安全加载流程;2)栈内存结构及值传递特性;3)HotSpot等三种JVM实现;4)堆内存分区(新生代/老年代/元空间)及GC工作原理;5)内存调优参数与OOM分析方法;6)GC算法对比(复制/标记清除/标记压缩)及分代收集策略;7)JMM内存模型与可见性保证。通过-Xms等参数可进行堆内存调优,配合MAT等工具可诊断内存问题。文章强调JVM学习需结合实践,推荐阅读《深入理解JVM》并关注常见面试考点。

月色真美 风也温柔 1317

【JVM】JMM(一):与硬件架构关系?与JVM关系?

1.硬件架构 假如是要设计Java虚拟机,那么最先要分析的一定是计算机硬件情况。 由于CPU速度快,所以在内存之前会有一个CPU缓存,所以这时就会存在内存与CPU缓存一致性的问题。 解决方案一:总线加锁(BUS),但是会降低CPU吞吐量 解决方案二:MESI协议。比如,当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据,CACHE LINE置为无效,其他的CPU在内存中读取数据。 2.JMM JMM只是一个模型,可以看做是对硬件架构的抽象:

A minor 2337

浅谈jvm和JMM内存模型

浅谈jvm和JMM内存模型 每每回看jvm设计以及cpu设计都忍不住膜拜行业大佬,虽然有相思之处,但是各有各个闪光点。 下面是自己参考大量资料总结出来的jvm jmm 以及cpu以及与cpu设计后总结出来的理解。 首先我们一定要记得jvm和jmm java内存模型是两个东西。很多行业小白或者面试官自己都分不清,就拿去面试,大多数java程序员都知道我们jvm的内存结构,当面试官问你内存模型你巴拉巴拉说一堆内存结构,如果没有及时纠正你的话可能就会一直犯错到有一天有人发现你。(本人就是,自己曾一度认为内存模

qq_43633503的博客 810
上一篇: 队列说明及代码实现
下一篇: @SpringBootApplication注解详解
suixinghero
博客等级 码龄7年 10粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值