【面试突击】Java内存模型实战

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送
发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景中间件系列笔记编程高频电子书

文章导读地址:点击查看文章导读!

感谢你的关注!

🍁🍁🍁🍁🍁🍁🍁🍁

前言

最近在更新面试突击专栏,我把每一篇将字数都尽量控制在 2000 字以内,可能在文章里边写的没有那么细致,主要是提供一些 问题 以及 回答的思路 ,以及 面试中可能忽略的漏洞 ,所以在看完文章之后,如果自己简历中有这方面的内容的话,一定要认真去整理一份自己的回答,并且多查阅相关资料,如果看的文章少,就会导致学习到的内容太片面

这块属于是 JVM 中的内容了,JVM 中的面试内容也是比较多的,包括常用的垃圾回收算法、垃圾回收器、堆、栈等等…

Java 内存模型(即 JMM)是在 《Java 虚拟机规范》 中定义的,目的是:定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节

JMM 规定了所有变量存储在主内存,每个线程都有自己的工作内存,线程 A 和线程 B 如果需要通信的话,需要经过 2 个步骤:

  1. 线程 A 把工作内存 A 中更新过的值刷新到主内存中
  2. 线程 B 去主内存中读取线程 A 刚更新过的值

在这里插入图片描述

Java 内存模型中的原子性、有序性、可见性是什么?

  • 原子性:一个操作以原子的方式执行,要么该操作不执行,要么执行过程中不可以被其他线程中断,就比如多线程环境下,i++ 必须是独立执行的,因为 i++ 不是原子操作,如果多线程同时执行,就会出现问题
  • 可见性:多个线程共享一个变量时,需要保证其中一个线程修改变量之后,被其他线程所感知到,并及时读取变量最新值
  • 有序性:指程序执行的顺序按照代码的先后顺序执行。在并发环境中,为了提高效率,编译器和处理器可能会对代码进行重排序,但是这种重排序不会影响单线程程序的执行,却可能影响到多线程并发执行的正确性

volatile 底层原理

如果面试中问到了 volatile 关键字,应该从 Java 内存模型开始讲解,再说到原子性、可见性、有序性是什么

之后说 volatile 解决了有序性可见性,但是并不解决原子性

volatile 可以说是 Java 虚拟机提供的最轻量级的同步机制,在很多开源框架中,都会大量使用 volatile 保证并发下的有序性和可见性

volatile 实现 可见性有序性 就是基于 内存屏障 的:

内存屏障是一种 CPU 指令,用于控制特定条件下的重排序和内存可见性问题

  • 写操作时,在写指令后边加上 store 屏障指令,让线程本地内存的变量能立即刷到主内存中
  • 读操作时,在读指令前边加上 load 屏障指令,可以及时读取到主内存中的值

JMM 中有 4 类内存屏障:(Load 操作是从主内存加载数据,Store 操作是将数据刷新到主内存)

  • LoadLoad:确保该内存屏障前的 Load 操作先于屏障后的所有 Load 操作。对于屏障前后的 Store 操作并无影响屏障类型

  • StoreStore:确保该内存屏障前的 Store 操作先于屏障后的所有 Store 操作。对于屏障前后的Load操作并无影响

  • LoadStore:确保屏障指令之前的所有Load操作,先于屏障之后所有 Store 操作

  • StoreLoad:确保屏障之前的所有内存访问操作(包括Store和Load)完成之后,才执行屏障之后的内存访问操作。全能型屏障,会屏蔽屏障前后所有指令的重排

在字节码层面上,变量添加 volatile 之后,读取和写入该变量都会加入内存屏障:

读取 volatile 变量时,在后边添加内存屏障,不允许之后的操作重排序到读操作之前

volatile变量读操作
LoadLoad 
LoadStore

写入 volatile 变量时,前后加入内存屏障,不允许写操作的前后操作重排序

LoadStore
StoreStore 
volatile变量写操作
StoreLoad

接下来了解一下 happens-before 是什么?

happens-before 原则是对 Java 内存模型的简化,帮助编程人员理解并发安全,happens-before 定义了一些规则,只要符合了这些规则,这些执行的先后关系就已经被确定了,不需要再通过 volatile 和 synchronized 来保证有序性,如果不符合这些规则,那么它们的执行就没有顺序性的保障,虚拟机可能会进行重排序!

  • 程序次序规则(Program Order Rule):在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写在后面的操作。准确地说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。
  • 管程锁定规则(Monitor Lock Rule):一个 unlock 操作先行发生于后面对同一个锁的 lock 操作。这里必须强调的是同一个锁,而 “后面” 是指时间上的先后顺序。
  • volatile 变量规则(Volatile Variable Rule):对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作,这里的 “后面” 同样是指时间上的先后顺序。
  • 线程启动规则(Thread Start Rule):Thread 对象的 start () 方法先行发生于此线程的每一个动作。
  • 线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过 Thread.join () 方法结束、Thread.isAlive () 的返回值等手段检测到线程已经终止执行。
  • 线程中断规则(Thread Interruption Rule):对线程 interrupt () 方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过 Thread.interrupted () 方法检测到是否有中断发生。
  • 对象终结规则(Finalizer Rule):一个对象的初始化完成(构造函数执行结束)先行发生于它的 finalize () 方法的开始。
  • 传递性(Transitivity):如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那就可以得出操作 A 先行发生于操作 C 的结论。

对于 happens-before 原则,不需要记它具体有哪些规则,也根本记不住,只要了解 happens-before 包括了一些规则,符合这些规则的情况下,有序性就已经被保证了,那么就不需要通过 volatile 去保证有序性

为什么需要 happens-before 原则呢?

这里也是为了大家理解,说一下为什么会需要这个原则

如果在 Java 内存模型中,所有代码的有序性都依靠 volatile 和 synchronized 去保证,那么很多操作将会变得非常罗嗦

而我们在编写代码时,并没有使用很多的 volatile 和 synchronized 去保证有序性,就是因为 Java 语言中的 happens-before 原则的存在

通过这个原则,就可以很快判断并发环境中,两个操作之间是否会存在冲突的问题

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

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

相关文章

使用GraphQL实现简单的增删改查

使用GraphQL实现简单的增删改查 GraphQL官网:https://graphql.cn/ Altair Graphql 调试工具:https://saltair.sirmuel.design/#download 或者添加扩展使用网页版:https://chrome.google.com/webstore/detail/altair-graphql-client/flnheeel…

中国数据库市场的领军黑马——亚信安慧AntDB数据库

自2008年问世以来,亚信科技AntDB数据库一直在中国国产数据库市场中崭露头角,尤其在信创政策的大力支持下,成为这一领域的一匹黑马。经过多次迭代,AntDB已经发展到了7.0版本,为超高强度和密度的业务需求提供了强有力的解…

基于Python的二氧化碳排放量数据分析系统

项目背景: 随着全球气候变化问题日益严重,减少温室气体排放已成为全球共识。我国作为全球最大的碳排放国,承担着重要的国际责任。为了更好地控制和减少碳排放,需要对全国的碳排放情况进行深入研究和分析。本项目旨在构建一个基于P…

【Linux】网络诊断 traceroute命令详解

目录 一、traceroute概述 1.1 traceroute命令简介 1.2 命令格式 1.3 原理 1.4 命令功能 二、使用实例 实例1:traceroute 用法简单、最常用的用法 实例2:跳数设置 实例3:设置探测数据包数量 实例4:显示IP地址&#xff0c…

一小时掌握:使用ScrapySharp和C#打造新闻下载器

引言 爬虫技术是指通过编程的方式,自动从互联网上获取和处理数据的技术。爬虫技术有很多应用场景,比如搜索引擎、数据分析、舆情监测、电商比价等。爬虫技术也是一门有趣的技术,可以让你发现网络上的各种有价值的信息。 本文将介绍如何使用…

leetcode 142 环形链表II

题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使…

C语言经典算法之简单选择排序算法

目录 前言 建议: 简介: 一、代码实现 二、时空复杂度: 时间复杂度: 空间复杂度: 三、算法的特性: 四、总结 前言 建议: 1.学习算法最重要的是理解算法的每一步,而不是记住…

MySQl导入与导出远程备份

文章目录 一. navicat导入导出 二. mysqldump命令导入导出导入导出 三. load data infile命令导入导出导入导出 四. 远程备份导入导出思维导图 一. navicat 导入 右键——>运行SQL文件 导出 选中要导出的表➡右键➡转储SQL文件➡数据和结构 二. mysqldump命令导入导出…

Oracle全系列版本官网下载保姆及教程

Oracle全系列版本官网下载方法 下面以下载Oracle12cR2为例说明下载的整个过程。 基本步骤如下: 先注册一个Oracle账号并登录;进入到客户下载页面搜索要下载的数据库版本;得到Oracle下载器(Oracle_SSN_DML_xxxxx.exe),注意&#xf…

智慧公厕:颠覆传统公共厕所管理的未来之路

公共卫生设施一直是城市管理中的重要环节,而智慧公厕作为一种全新的公用卫生设施,以其融合了物联网、大数据、云计算等新型信息技术的特点,引起了人们的广泛关注。通过智能化手段的管理和服务,智慧公厕不仅解决了传统公厕中存在的…

微机原理常考填空以及注意事项

以下: 1,两条高位地址线未参加地址译码,则对应的地址范围它的容量是多少倍? 答:公式CPU的地址线(假设16位)(它的低位地址线一般进入片内A0~A10,高位A11就是A、A12就是B、…

DNS

目录 一、名字解析介绍和DNS 1.1.什么是DNS 1.2.域名体系结构 1.3.DNS查询方式 1.4.DNS解析过程 1.5.DNS服务器类型 二、安装配置 2.1.DNS软件bind 2.2.修改权限 和 监听地址 2.3.手写域名配置文件 2.4.手写数据库配置文件 2.5检测文件格式的命令 一、名字解析介绍和…

【OpenCV学习笔记12】- 更改颜色空间

关于 OpenCV 官方文档的核心操作告一段落,接下来开始图像处理的学习。学习笔记中会记录官方给出的例子,也会给出自己根据官方的例子完成的更改代码,同样彩蛋的实现也会结合多个知识点一起实现一些小功能,来帮助我们对学会的知识点…

【数学建模美赛M奖速成系列】数据可视化(二)

数据可视化(二) 写在前面百分比堆叠线条图优点缺点实现pythonmatlab 火山图优点实现pythonmatlab 最后 写在前面 上一篇文章为大家分享了山脊图和气泡图的绘图方法与代码,这里学姐为继续为大家分享百分比堆叠线条图和火山图,包含…

R语言【文章复现】——集成式地绘制高分辨率的多样性分布图,对方法的检验和优化,以及处理思路的思考

参考文献 本文对一篇 2022 年发表在 New Phytologist 的绘图方法文章中的技术路线进行复现。 An integrated high-resolution mapping shows congruent biodiversity patterns of Fagales and Pinales Summary 文中,作者针对在全球尺度上绘制物种分布图提出了一种全新的方法…

华为网络设备 通过路由器子接口 Dot1q终结子接口实现跨VLAN通信

(二层交换机直接跳过三层交换价接入路由器时才使用该配置。推荐使用三层交换机建立VLANIF配置更简洁明了。如果VLAN较少可直接配置;路由器接口,一个物理接口一个VLAN) S1配置 vlan batch 2 to 3interface GigabitEthernet0/0/1port link-type trunkpor…

为什么代码里需要try/catch

throw 语句用来抛出一个用户自定义的异常,在抛出错误时,throw 之后的语句将不会执行 const getApi (data) > {if (isNaN(data)) {throw new Error(Parameter is not a number!);console.log(bar) // 这句永远不会执行,throw之后的代码都不会}}情况一…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码(直接在cmd命令提示符中,不需要打开Python) pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

喜报 ,思迈特荣获广东省“专精特新”企业认定,再创新高

近日,广东省工业和信息化厅发布 2023年专精特新中小企业名单,思迈特软件凭借专业技术实力、创新研发能力、行业影响力以及卓越的企业文化,经过层层选拔,荣获广东省“专精特新”企业认定。思迈特商业智能与大数据分析软件成功上架&…

智能制造工业互联网建设方案——青创智通工业物联网

智能制造已经成为工业发展的重要趋势。智能制造系统架构与工业物联网建设方案作为实现智能制造的关键环节,对于推动工业转型升级和提升企业竞争力具有重要意义。青创智通工业物联网重点探讨智能制造系统架构与工业物联网建设方案的核心要素、实施步骤和未来发展方向…