【面试问题-java内存模型JMM】

news2024/12/25 12:29:09

今天面试,我把运行时数据区域答成了java内存模型,回来把这方面的问题给纠正一下。
以下内容阅读自《深入理解Java虚拟机》第12章
下面小段只做了解即可。重点是Java内存模型。

多任务处理在现代计算机操作系统中是必备的功能。
计算机运行速度与它的存储和通信子系统的速度差距太大,大量时间花费在磁盘I/O、网络通信或者数据库访问上。因此多处理器中,程序的并发将决定服务器能处理的事务数,也即TPS(Transactions Per Second,代表一秒内服务端能响应的请求总数),而这是衡量一个服务性能的好坏。

硬件的效率通过在处理器和内存之间增加高速缓存来解决处理器与内存之间速度的矛盾,同时也引入一个新问题:缓存一致性(Cache Coherence)。在多路处理器系统中,每个处理器都有自己的高速缓存,这种系统称为共享内存多核系统。为解决缓存一致性问题,要求各个处理器访问缓存时遵循一些协议,在读写时要根据协议进行操作,这类协议有MSI、MESI、MOSI、Synapse、Firefly及Dragon Protocol等。
在这里插入图片描述

除了高速缓存以外,处理器可能会对输入代码进行乱序执行(Out-Of-Order-Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证对结果与顺序执行的结果一致。Java虚拟机的即时编译器也有指令重排(Instruction Reorder)优化。

Java内存模型

由于不同平台上内存模型有差异,对于C/C++等语言的并发在不同平台上经常出错。而Java要达到各种平台下运行达到一致的内存访问效果,就需要屏蔽各种硬件和操作系统的内存访问差异。就需要定义Java内存模型,这个内存模型必需足够严谨,才能让Java的并发内存访问操作不会产生歧义;但是也必需定义得足够宽松,使得虚拟机得实现能有足够得自由空间去利用硬件得各种特性来获取更好的执行速度。Jdk5发布之后,内存模型终于成熟和完善起来。

主内存和工作内存

Java内存模型主要目的是定义程序中各种变量的访问规则,即关注主内存和工作内存中变量读取和存储的底层细节。
这里的变量不同于Java中的变量,它包含了实例字段、静态字段、构成数组对象的元素,但是不包含局部变量和参数变量,因为后者是线程私有的,不会被共享。
每个Java线程都有一份自己的工作内存以及一份所有线程共有的主内存,每个线程的变量都是主内存的副本,Java线程不能直接跟主内存通信,必须经过工作内存和主内存通信。
在这里插入图片描述

内存交互操作

以下内存只做了解即可。
包括lock、unlock、read、load、use、assign、store、write
lock:锁定,用于主内存中变量,标识该变量被一条线程独占状态
unlock:解锁,用于主内存中变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
read:读取,用于主内存中变量,把一个变量从主内存传输到线程的工作内存,以便少候load动作使用。
load:加载,作用于工作内存,把read读取的主内存中的值放入到工作内存的副本中。
use:使用,作用于工作内存,把工作内存中的一个变量传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
assign:赋值,作用于工作内存的变量,他把一个从执行引擎接受的值赋给工作内存,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store:存储,作用于工作内存的变量,他把一个工作内存中的变量的值传送到主内存中,以便随后的write操作使用。
write:写入,作用于主内存的变量,他store操作从工作内存中得到的变量的值放入到主内存的变量中。

书本里介绍了一系列规则,不一一介绍,有兴趣可以找这本书看下。
作者提到对此无需过分担忧,除了进行虚拟机开发的团队外,大概没有其他开发人员会议这种方式思考并发问题,我们只需要理解Java内存模型的定义即可。

volatile型变量的特殊规则

用通俗且不那么正式的话来说:volatile保证变量对所有线程的可见性。

只保证每次执行引擎获取工作内存的数据时,是取到的最新的值,但是由于Java运算操作符并非原子性的,导致即使是volatile变量的运行在并发下一样不安全。

具体可以自行尝试开20个线程,对int类型的volatile变量进行++操作,可以发现值小于应该等于的那个值。如:volatile int race = 0; 那么20个线程,每个线程对这个race变量进行10000个++操作,会得到200000,实际都会小于这个值,因为每次工作线程读取的值都是栈顶最新的值,但是由于其他线程在读取线程后操作了该变量的值,导致了原来读取的值总会小于实际最新的值。可以自行javap反编译查看字节码指令。

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

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

相关文章

【MySQL】数据库基础

目录 1、什么是数据库 2、 数据库基本操作 2.1 查看当前数据库 2.2 创建一个数据库 2.3 选中数据库 2.4 删除数据库 3、常见的数据类型 3.1 数值类型 3.2 字符串类型 3.3 日期类型 4、表的操作 4.1 创建表 4.2 查看指定数据库下的所有表 4.3 查看表的结构 4.…

java常见的异常

异常分类 Throwable 是java异常的顶级类,所有异常都继承于这个类。 Error,Exception是异常类的两个大分类。 Error Error是非程序异常,即程序不能捕获的异常,一般是编译或者系统性的错误,如OutOfMemorry内存溢出异常等。 Exc…

环境变量和进程地址空间

目录 环境变量: env:显示所有的环境变量: echo $环境变量名表示查看环境变量的值 理解环境变量: getenv:显示环境变量的值 export set命令:显示所有变量 unset取消变量: pwd:当…

Django框架之模型查询-关联查询

关联查询 查询书籍为1的所有人物信息 查询人物为1的书籍信息由一到多的访问语法&#xff1a; 一对应的模型类对象.多对应的模型类名小写_set 例&#xff1a; >>> book BookInfo.objects.get(id1) >>> book.peopleinfo_set.all() <QuerySet [<Peopl…

buntu18 安装 openpose(GPU)环境

openpose环境 搭建 很费劲&#xff0c; 需要装软件也多&#xff0c; 还必须要考虑版本的问题。我主要是参考链接 ubuntu18安装openpose详细步骤_litbo的博客-CSDN博客_ubuntu安装openpose 其中&#xff0c;我的实验中 有如下需要更改。 1、我的是 cuda-10.2 2、gcc 和g 必…

Linux下Socket编程利用多进程实现一台服务器与多台客户端并发通信

文章目录前言一、服务器 server二、客户端 client三、并发通信演示四、程序源码前言 前些日子同“ Linux应用编程 ”专栏中发布过的TCP及UDP在Linux或Windows下的通信都为单进程下的Socket编程&#xff0c;若还存在一些套接字相关函数模糊不清&#xff0c;读者可移步“Socket编…

整合K8s+SpringBoot+gRpc

本文使用K8s当做服务注册与发现、配置管理&#xff0c;使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…

Python3 模块实例及演示

在前面的几个章节中我们基本上是用 python 解释器来编程&#xff0c;如果从 Python 解释器退出再进入&#xff0c;那么定义的所有的方法和变量就都消失。 为此 Python 提供了1个办法&#xff0c;把这些定义存放在文件中&#xff0c;为一些脚本或者交互式的解释器实例使用&…

[oeasy]python0085_ASCII之父_Bemer_COBOL_数据交换网络

编码进化 回忆上次内容 上次 回顾了 字符编码的 进化过程 IBM 在数字化过程中 作用 非常大IBM 的 BCDIC 有 黑历史 &#x1f604; 6-bit的 BCDIC 直接进化成 8-bit的 EBCDIC补全了 小写字母 和 控制字符 在ibm就是信息产业的年代 ibm的标准 怎么最终 没有成为 行业的标准 呢…

OCR标注方法

虽然说标注工作不是由算法工程师负责的&#xff0c;但是如何标注&#xff0c;标注要求却是由算法工程师指导标注人员去实施的&#xff0c;如果标注工作人员标注的数据有问题&#xff0c;就会出现模型训练不收敛的问题&#xff0c;导致很多问题的出现&#xff0c;所以标注要求很…

MySql调优基础知识

MySql调优 调优金字塔 系统设计&#xff1a;数据不适合放入mysql&#xff0c;es、MQ、Redis、读写分离。 mysql调优&#xff1a;主要是索引且要熟悉业务。 mysql导致慢查询的原因是因为数据太多了。 1.sql查询 1.1尽量使用覆盖索引 1.2数据表结构&#xff0c;统计汇总&am…

普通单双面板的生产工艺流程之图形转移,华秋一文告诉你

衔接上文&#xff0c;继续为朋友们分享普通单双面板的生产工艺流程。 如图&#xff0c;第五道主流程为图形转移。 图形转移的目的为&#xff1a; 利用光化学原理&#xff0c;将图形线路的形状转移到印制板上&#xff0c;再利用化学原理&#xff0c;将图形线路在印制板上制作出…

Tomcat- AJP协议文件读取/命令执行漏洞(CVE-2020-1938 / CNVD-2020-10487)

CVE-2020-1938 1.概述1.1 tomcat概述1.2 gostcat概述 - 漏洞概述2. 漏洞成因2.1 前置基础2.1.1 Tomcat Connector(连接器)2.1.2 Servlet(服务程序)2.1.3 Tomcat内部处理请求流程2.2 源码追踪分析两个利用方案的执行流程2.2.1 获取利用poc2.2.2 文件读取漏洞关键点1&#xff1a;…

CSDN城市开发者联盟、C友会期待你的加入

文章目录&#x1f31f; 课前小差&#x1f31f; chatGPT&#x1f31f; CSDN中的持续学习&#x1f31f; 23年原力计划&#x1f31f; C友会、CDC&#x1f31f; 如何关联本地的开发者&#xff1f;&#x1f31f; 写在最后&#x1f31f; 课前小差 哈喽&#xff0c;大家好&#xff0c…

2月datawhale组队学习:大数据

文章目录一、大数据概述二、 Hadoop2.1 Hadoop概述2.2 su:Authentication failure2.3 使用sudo命令报错xxx is not in the sudoers file. This incident will be reported.2.4 创建用户datawhale&#xff0c;安装java8&#xff1a;2.5 安装单机版Hadoop2.5.1 安装Hadoop2.5.2 修…

excel报表技巧:几个关于汇报演示方面的小功能

年终了&#xff0c;总结汇报避免不了。如果你的PPT还不够好&#xff0c;那就直接用Excel做汇报吧~这里有5条小技巧&#xff0c;可以帮助你最高效地展示自己的成绩报表&#xff01;想象一下&#xff0c;用SHIFTCTRLF1全屏显示你的工作表&#xff0c;配合上CtrlPageDown进行工作表…

WMS系统解决方案,数据从“人工采集”转为“自动采集”

今年以来&#xff0c;新冠疫情危机促使国内企业重新审视自我发展&#xff0c;加速了行业转型的步伐。很多制造企业放慢了规模扩张的脚步&#xff0c;应需而变&#xff0c;从规模速度型向质量效率型转型升级。纵观市场现状&#xff0c;很多制造企业面临产能过剩、成本上升、库存…

CHAPTER 4 监控全网服务器

监控全网服务器4.1 需求说明4.2 规划方案4.2.1 api接口使用&#xff08;curl&#xff09;4.3 具体实施规划4.3.1 硬件、系统、网络监控4.3.2 应用服务监控4.3.3 监控服务通用方法4.4 实施全网监控4.4.1 使用自动发现规则4.4.2 监控备份服务器1. 添加模板2. 添加应用集3. 添加监…

【观察】Solidigm P44 Pro SSD评测:原厂品质+软硬兼施=性能怪兽

众所周知&#xff0c;目前SSD&#xff08;固态硬盘&#xff09;已取代HDD&#xff08;机械硬盘&#xff09;成为电脑中常见的存储设备&#xff0c;特别是在技术创新的持续推动下&#xff0c;如今SSD的速度和效率都在不断地提高&#xff0c;从SATA2 3GB发展到SATA3 6GB&#xff…

计算机组成原理学习笔记:循环冗余校验码

循环冗余校验码 CRC 码 循环冗余校验码 (cyclic redundancy Check, CRC) 十进制除法 从熟悉的十进制出发&#xff0c;假设现在你要给另一个人传送882这样的一个10进制数据&#xff0c;为了防止传送数据的过程中某一个数据发生错误你可以和你的另一个小伙伴约定一个除数&…