JVM内存结构Java内存模型Java对象模型

悟空老师思维导图:
https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9icon-default.png?t=N7T8https://naotu.baidu.com/file/60a0bdcaca7c6b92fcc5f796fe6f6bc9

1.JVM内存结构&&Java内存模型&&Java对象模型

1.1.JVM内存结构

1.2.Java对象模型

        Java对象模型表示的是这个对象本身的存储模型,JVM会给这个类创建一个instanceKlass保存在方法区,用来在JVM层表示该Java类,当在Java代码中使用new创建一个对象时JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据;

1.3.Java内存模型(JMM)

1.3.1.为什么需要JMM?

        1.C语言不存在内存模型概念;

        2.Java程序依赖处理器,不同处理器结果不一样;

        3.无法保证并发安全;

1.3.2.什么是JMM?

        JMM是一组规范,需要各个JVM的实现来遵循JMM规范,以便开发者可以利用这些规范更方便的开发多线程程序;如果没有这样一个JMM内存模型来规范,那么很可能经过了不同JVM的不同规则的重排序后,导致不同虚拟机上运行的结果不一样;JMM不仅仅作为一组规范它同时还是“工具类”、“synchronized”、“Lock”等的原理;

1.3.3.JMM核心内容

        1.重排序

        2.可见性

        3.原子性

        并发编程线程安全问题的根源在于:重排序、可见性;

1.3.3.1.重排序
1.3.3.1.1.什么是重排序

        代码在JVM中的执行顺序和在Java代码中的顺序不一致;(代码指令执行顺序并不是严格按照语句顺序执行的,这就是重排序);

1.3.3.1.2.重排序代码案例
import java.util.concurrent.CountDownLatch;
/*** 演示代码执行时被JVM重排序*/
public class OutOfOrderExecution{private static int x = 0,y = 0;private static int a = 0,b = 0;public static void main(String[] args) throws InterruptedException {// 计数器int i = 0;for(;;){i++;// 重置a = 0;b = 0;x = 0;y = 0;// 闸门CountDownLatch countDownLatch = new CountDownLatch(1);// 线程一Thread one = new Thread(new Runnable() {@Overridepublic void run() {try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}a = 1;x = b;}});// 线程二Thread two = new Thread(new Runnable() {@Overridepublic void run() {try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}b = 1;y = a;}});two.start();one.start();// 放开闸门countDownLatch.countDown();// 主线程等待子线程执行完成one.join();two.join();String result = "第:"+ i +"次" + "(" + x + "," + y + ")";if(x == 0 && y == 0){ // 说明:如上代码出现x,y都等于0的情况说明代码执行时被重排序了(即代码并未按照编写顺序执行,而是被编译器重排序了其执行顺序大致为:y=a=0,x=b=0,b=1,a=1,)System.out.println("执行代码被重排序了:" + result);break;}else {System.out.println(result);}}}
}

执行结果

1.3.3.1.3.重排序好处

1.3.3.1.4.重排序的三种情况

        1.编译器优化;

        2.CPU指令重排;

        3.内存的“重排序”

1.3.3.2.可见性
1.3.3.2.1.什么是“可见性”问题

        可见性:指一个线程对共享变量的修改对于其它线程是可见的;

        可见性问题:多线程并发访问共享变量时,一个线程对共享变量的修改对于其它线程可能是不

                              可见的;

1.3.3.2.2.为什么会有“可见性”问题

        因为CPU有多级缓存,导致某些线程读取到的数据可能已经过期;如果所有CPU核心都只用一个缓存,那就不存在可见性问题;而实际情况是每个核心都会将需要的数据读取到自己的“独占缓存”中,数据修改后也是先写入到自己的“独占缓存”,然后等待刷新到“主存”(所有核心共享)中,在数据还未被刷新到“主存”时造成其它核心读取到过期的数据值;

1.3.3.2.3.什么是happens-before

        happens-before规则是用来解决“可见性”问题的,即在时间上动作A发生在动作B之前,B保证能看见A的所有操作这就是happens-before;

1.3.2.2.4.哪些运用了happens-before规则

        1.单线程规则;

        2.锁操作(synchroniezd和Lock);

        3.volatile变量;

        4.线程启动;

        5.线程join;

        6.传递性(hb代表happens-before; 如果hb(A,B),且hb(B,C)则可以推出hb(A,C)) ;

        7.中断(一个线程被其它线程interrupt,那么检测中断(IsInterrupted)或者抛出 

           InterruptedExcption一定能被其它线程看见);

        8.构造方法(对象构造方法的最后一条指令,finalize()方法一定能看到)

        9.工具类的happens-before原则

               9.1.线程安全的容器,如“ConcurrentHashMap”,get一定能看到之前的所有put操作;

                9.2.CountDownLatch

                9.3.Semaphore

                9.4.Future

                9.5.线程池

                9.6.CyclicBarrier

1.3.3.3.原子性
1.3.3.3.1.什么是原子性

     一系列操作,要么全部执行成功,要么全部不执行或全部执行失败,不会出现执行一半的情况,原子是不可分割的;

1.3.3.3.2.Java中的原子操作有哪些

1.除long和double之外的基本类型赋值操作(int,byte,boolean,short,char,float);

2.所有“引用”的赋值操作;

3.java.concurrent.Atomic.*包下所有类的原子操作;

备注:创建对象不是原子性操作!

1.创建对象操作不是原子性操作,其由三个操作构成(Singleton5 instance = new Singleton5(););1.1.创建一个空的instance;1.2.调用构造方法;1.3.将创建好的对象赋值给instance实例;
1.3.3.3.3.long和double原子性问题

        对于32位的JVM long和double的操作不是原子的(32位JVM中会将long和double的一次写入操作拆分成2个单独的写入操作),但是在64位的虚拟机上long和double的操作是原子的,在实际开发中商用的Java虚拟机已经处理了这个问题;我们自己也可以使用volatile去解决;

1.3.3.4.原子操作 + 原子操作 != 原子操作

        简单地把原子操作组合在一起并不能保证整体依然具有原子性;

1.4.synchronized可见性的正确理解

        1.4.1.synchronized不仅保证了原子性还保证了可见性;

        1.4.2.synchronized不仅让被保护的代码线程安全,还让加锁之前的代码具有可见性;

1.5.面试题

1.5.1.单例模式的七种写法及单例和并发的关系

        详见:单例模式的七种写法URL

1.5.2.讲一讲什么是Java内存模型

        是一组规范,规范了JVM,CPU,JAVA代码之间一系列转换关系,Java内存模型最重要是“重排序”,“可见性”,“原子性”这三个部分(重排序讲1.3.3.1重排序的例子和重排序的好处),(可见性讲因为CPU有多级缓存JMM对内存抽象为“主内存”和“本地内存”,主内存是所有线程所共享的,本地内存是线程独占的其它线程访问不了。一个线程对变量的更改是先更新到本地内存中再同步到主内存中,其它线程只能在主内存中同步这个变量的值,因为本地内存同步到主内存是需要时间的这样就会导致一个线程在本地内存中已经更改了值而这个值还没有被同步到主内存中去,这样对于其它线程来说这个值的更改是不可见的,就会导致其它线程重主内存中拿到的值还是一个旧的值,这样就出现了“线程安全”问题,对于“可见性”来说还有一个happens-before原则即在时间上动作A发生在动作B之前,B保证能看见A的所有操作这就是happens-before; 再可以讲下1.3.2.2.4哪些运用了happens-before原则及再讲下volatie关键字volatile关键字),(最后可以再讲下1.3.3.3.2Java中的原子操作有哪些);

1.5.3.什么是原子操作?Java中有哪些原子操作?创建对象是原子操作吗?

        详见1.3.33原子性;

1.5.4.64位的double和long写入的时候是原子的吗?

        32位虚拟机上不是原子的,64位虚拟机上是原子的,实际开发中使用的商用Java虚拟机已经处理了这个问题不需要我们再考虑;

1.5.5.volatile和synchronized的异同

        详见volatile关键字;

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

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

相关文章

Isaac Sim urdf文件导入

本教程展示如何在 Omniverse Isaac Sim 中导入 urdf 一. 使用内置插件导入urdf 安装urdf 插件 方法是转到“window”->“Extensions” 搜索框中输入urdf, 并启用 通过转至Isaac Utils -> Workflows -> URDF Importer菜单来访问 urdf 扩展。 表格中的 1,2,3 对应着…

VR全景展示的功能有哪些?适合用于哪些领域?

现如今,VR全景展示技术已经逐渐融入了我们的日常生活中,可能大部分人都还没有意识到VR全景是如何应用的,但其实VR全景针对多个行业的垂直领域都有一定的落地使用。在互联网高速发展的今天,多媒体所包含的种类也越来越多&#xff0…

SpringAOP复习

SpringAOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程。他是一种可以在不修改原来核心代码的情况侠给程序动态统一进行增强的一种技术 SpringAOP:批量对Spring容器中的bean方法做增强,并且这种增强不会与原来方…

Odoo16 实用功能之在Form视图的各个部位加入按钮

目录 1、 如何在form视图中的头部加上按钮 2、如何在form视图中的身体加上按钮 3、如何在notebook标签中加入按钮 1、 如何在form视图中的头部加上按钮 以CRM中的渠道form视图为例子介绍&#xff08;实现红框中的效果&#xff09; 直接在<header>标签里加入按钮即可 …

树莓派4B搭建开源NAS系统openmediavault

目录 搭建过程使用镜像准备硬件准备软件账号信息制作系统盘首次启动配置获取树莓派IP地址 ssh登录到树莓派上登录到openmediavualt连接到wifi 搭建过程 搭建过程参考链接两篇文章,已经搭建完毕.期间遇到一些坑,为了方便大家,我把搭建好的镜像和使用到的工具放在百度网盘共享了…

HashSet 和HashMap的区别、优缺点、使用场景

HashSet和HashMap是Java集合框架中的两个常用类&#xff0c;它们都用于存储和管理数据&#xff0c;但在使用方式、功能和性能上有很大的区别。 HashSet和HashMap的区别 区别一&#xff1a;用途不同 HashSet&#xff1a;HashSet是一个基于哈希表的集合&#xff0c;用于存储不…

常用两种Linux命令生成器

在Linux中&#xff0c;可以使用多种命令来生成随机密码。以下是其中两种常用的命令&#xff1a; 1.pwgen&#xff1a;这个命令可以生成随机、无意义的但容易发音的密码。生成的密码可以只包含小写字母、大小写混合或数字。大写字母和数字会以一种便于记忆的方式放置&#xff0…

Java_Stream流

一、JDK8新特性&#xff08;Stream流&#xff09; 接下来学习一个全新的知识&#xff0c;叫做Stream流&#xff08;也叫Stream API&#xff09;。它是从JDK8以后才有的一个新特性&#xff0c;是专业用于对集合或者数组进行便捷操作的。有多方便呢&#xff1f;我们用一个案例体…

【OAuth2】授权框架的四种授权方式详解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《OAuth 2》。&#x1f3af;&#x1f3af; &#x1…

TwIST算法MALTLAB主程序详解

TwIST算法MALTLAB主程序详解 关于TwIST算法的具体原理可以参考&#xff1a; 链接: https://ieeexplore.ieee.org/abstract/document/4358846 链接: https://blog.csdn.net/jbb0523/article/details/52193209 该算法的MATLAB源代码&#xff1a; 链接: http://www.lx.it.pt/~bi…

Node.js(二)-模块化

1. 模块化的基本概念 1.1 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层将系统拆分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 1.2 编程领域中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&…

48V转12V 300mA降压芯片,60V耐压、0.6A稳压芯片带ECO模式-AH590L

AH590L是一种48V转12V 300mA降压芯片&#xff0c;具有60V耐压、0.6A稳压电流的特点&#xff0c;并且还带有ECO模式&#xff0c;是一种理想的开关电源解决方案。 AH590L是PWM模式 DC/DC降压转换器。TEL&#xff1a;l86*4884*3702*宽输入电压范围4至60V适用于工业领域的广泛应用…

AI安全综述

1、引言 AI安全这个话题&#xff0c;通常会引伸出来图像识别领域的对抗样本攻击。下面这张把“熊猫”变“猴子”的攻击样例应该都不陌生&#xff0c;包括很多照片/视频过人脸的演示也很多。 对抗样本的研究领域已经具备了一定的成熟性&#xff0c;有一系列的理论来论述对抗样本…

one wire(单总线)FPGA代码篇

一.引言 单总线&#xff08;OneWire&#xff09;是一种串行通信协议&#xff0c;它允许多个设备通过一个单一的数据线进行通信。这个协议通常用于低速、短距离的数字通信&#xff0c;特别适用于嵌入式系统和传感器网络。 二.one wire通信优点缺点 优点&#xff1a; 单一数据线…

Unity程序向Web服务器发送数据

Unity程序向Web服务器发送数据 一、介绍二、HTTP协议三、新建Unity工程&#xff0c;创建脚本1.新建Unity工程&#xff0c;创建脚本WebManager.cs&#xff0c;将其指定给场景中的任意游戏体。2.在WebManager.cs中添加一个m_info属性和OnGUI函数显示UI&#xff1a; 四、GET请求在…

一个利用摸鱼时间背单词的软件

大家好&#xff0c;我是 Java陈序员。 最近进入了考试季&#xff0c;各种考试&#xff0c;英语四六级、考研、期末考等。不知道大家的英语四六级成绩怎么样呢&#xff1f; 记得大学时&#xff0c;英语四级都是靠高中学习积累的老本才勉强过关。 而六级则是考了多次&#xff…

20231224解决outcommit_id.xml1 parser error Document is empty的问题

20231224解决outcommit_id.xml1 parser error Document is empty的问题 2023/12/24 18:13 在开发RK3399的Android10的时候&#xff0c;出现&#xff1a;rootrootrootroot-X99-Turbo:~/3TB/Rockchip_Android10.0_SDK_Release$ make installclean PLATFORM_VERSION_CODENAMEREL…

静态HTTP的常见问题和解决方法

大家好&#xff0c;欢迎来到今天的“静态HTTP大讲堂”&#xff01;今天我们要聊聊静态HTTP的常见问题和解决方法。别小看这些问题哦&#xff0c;它们就像是那些顽皮的小妖精&#xff0c;时不时地给你的网站搞点恶作剧。不过别担心&#xff0c;有我在&#xff0c;这些小妖精都得…

推荐一款好用的免费图片转换工具bmp转png工具bmp2png

推荐一款好用的免费图片转换工具bmp转png工具bmp2png 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用&#xff0c;但是COCOS2DX不支持BMP如果直接将BMP转换到PNG的话&#xff0c;网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xff1f;要累死所以写了…

HBase 超大表迁移、备份、还原、同步演练手册:全量快照 + 实时同步(Snapshot + Replication)不停机迁移方案

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,京东购书链接:https://item.jd.com/12677623.html,扫描左侧二维…