Java-并发高频面试题

1.说一下你对Java内存模型(JMM)的理解?

其实java内存模型是一种抽象的模型,具体来看可以分为工作内存和主内存。
JMM规定所有的变量都会存储再主内存当中,再操作的时候需要从主内存中复制一份到本地内存(cpu内存)再线程内部做计算,然后再回写到主内存
在这里插入图片描述

本地内存它其实也是JMM的 一个抽象概念,并不真实存在。具体来看是包括缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。
在这里插入图片描述
从上图我们可以看到实际的内存模型包括了控制器和操作运算器,
同时工作内存就对应这里的 Ll 缓存或者 L2 缓存或者 CPU 寄存器。

2.说说你对原子性、可见性、有序性的理解?

我们围绕着java内存模型其实可以发现有很多问题,它是如何来保证原子性,可见性和有序性的呢?
想要知道这些 我们首先要知道什么是原子性,可见性和有序性
原子性:原子性说白了就是指一个操作是不可分割,不可中断的,一个线程在执行时,其他线程不会影响到它
那么**如何来保证原子性呢?**在java中为了保证原子性,提供了两个高级指令 monitorenter和moitorexit ,而具体实现来看如synchronized就可以保证原子性

可见性:首先为啥会有可见性问题?上面也说了是分为了工作内存和主内存,操作的时候,每个线程都是操作自己工作内存的数据,然后再会写到主内存,如果没有及时同步到主内存或者并发时,就会存在不一致的问题,总结来看可见性就是 某个线程修改了某一个共享变量的值时,其它线程能够立即知道这个修改
如何保证可见性呢? 在java实现中可以用volatile或者synchronized 以及final来保证可见性,具体实现原理下面再说

有序性:首先还是要明白为啥会存在有序性问题?其实这和指令重排有关,也就是说再java中存在指令重排–就是java文件中的内容会被编译,再执行前需要转化为cpu可以识别的指令,cpu再执行这些指令时,为了提升执行效率,在不影响最终结果的前提下,会对指令进行重排
因此就出现了有序性的问题,所以有序性 就是指 对于一个线程的执行代码,从前往后依次执行

如何来保证有序性呢? 具体来看还是可以用volatile 以及synchronized
volatile关键字可以禁止指令重排,而synchronized通过加锁的方式保证同一时刻只有一个线程在操作执行。

3 什么是指令重排?

说白了就是在程序执行时,为了提升效率,编译器 和执行器在执行指令时会对指令进行重排序,但是注意不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件:
在单线程环境下不能改变程序运行的结果;
存在数据依赖关系的不允许重排序
这两个条件其实也就是两个规则as-if-serial和 happens-before;
需要注意的是:重排序不会影响单线程环境的执行结果,但是会破坏多线程的执行语义。
所以总结来看 as-if-serial语义和happens-before这么做的目的,都是为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度。

4 volatile实现原理了解吗?

首先我们要知道从java内存模型的角度来看 volatile有两个作用,保证可见性和有序性。

那么volatile是如何保证可见性的呢?
volatile保证可见性主要是通过lock前缀指令和MESI缓存一致性协议;
啥意思呢?也就是说如果一个变量被volatile修饰,那么当你对这个变量进行写操作时,jvm都会向处理器发送一条lock前缀指令,那么工作内存中的值就会被强制刷入到主内存中,而其他处理器的缓存由于遵守了缓存一致性协议,也就会把这个变量的值从主内存加载到自己的工作内存中,这样一来也就保证了可见性

volatile是如何保证有序性的呢?
volatile保证有序性主要是通过禁止指令重排,再具体来看就是禁止编译器和处理器的重排序
那么问题来了,它是怎么禁止指令重排的呢?
其实他的实现原理主要是基于内存屏障,即在指令序列中插入内存屏障来禁止特定类型的处理器重排序。
而内存屏障主要包括 storestore,storeload,loadload,loadstore屏障
说白了这些内存屏障保证了代码程序会按照代码的先后顺序执行,进而来保证有序性。

未完待续啊,… 多多支持,加油💪🏻

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

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

相关文章

头歌C++之for循环应用(II)

目录 第1关:百钱买百鸡问题 本关必读 本关任务 测试说明 第2关:找出乒乓球比赛中3对赛手的名单 本关必读 本关任务 测试说明 第3关:计算球第n次落地时经过的距离和反弹的高度 本关必读 本关任务 测试说明 第1关:百钱买…

Utreexo:优化Bitcoin UTXO集合的基于哈希的动态累加器

1. 引言 前序博客: Utreexo:比特币UTXO merkle tree proof以节约节点存储空间 MIT Digital Currency Initiative 的 Thaddeus Dryja 2019年论文 Utreexo: A dynamic hash-based accumulator optimized for the Bitcoin UTXO set。 开源代码实现见&…

【leetcode100-077到080】【贪心】四题合集

【买股票】 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取…

KubeSphere 核心实战之四【在kubesphere平台上部署Ruoyi-cloud项目】(实操篇 4/4)

**《KubeSphere 核心实战系列》** KubeSphere 核心实战之一(实操篇 1/4) KubeSphere 核心实战之二(实操篇 2/4) KubeSphere 核心实战之三(实操篇 3/4) KubeSphere 核心实战之四(实操篇 4/4&…

前端颜料盘??

前端颜料盘&#xff1f;&#xff1f; 一、原生颜料盘 <input type"color" placeholder"选择颜色">二、第三方开源库 Pickr&#xff1a; GitHub: https://github.com/Simonwep/pickr官方网站: https://simonwep.github.io/pickr/Pickr 是一个轻量级…

20240130 大模型快讯

//社区生态// 讯飞星火大模型v3.5发布。讯飞发布了完全基于全国产算力平台“飞星一号”训练的星火大模型v3.5&#xff0c;同时开源深度适配国产算了的iFlyTekSpark-13B大模型。 Code Llama 70B大模型发布。Meta发布并开源了基于Llama 2的大模型Code Llama 70B&#xff0c;在Hu…

产品说明书怎么做?有模板吗?

产品说明书是一种重要的工具&#xff0c;它向消费者提供有关产品的详细信息和使用指南。一个好的产品说明书不仅可以帮助消费者正确地使用产品&#xff0c;还可以增加产品的销售量和用户满意度。那么&#xff0c;如何制作一份优秀的产品说明书呢&#xff1f;是否有现成的模板可…

ubantu操作hbase

到firefox中按照网站找以下文件进行下载 新建一个窗口启动节点 下载完成则回到下载目录 如果下载慢也可以将文件放在share中&#xff0c;然后拷贝到当前目录 进入到root 然后回到hadoop 解压到/usr/local 进入到local&#xff0c;将hbase改名 修改权限 配置环境变量 执行 回到h…

【小白学unity】上下左右移动+跳跃

1. 找到一个棒棒糖图片&#xff0c;拖入到unity中。 2. 将棒棒糖拖入到场景中&#xff0c;重命名为lolipop。 3. 给lolipop添加一个Rigidbody2D组件。 4. 创建一个C#脚本LolipopController.cs&#xff0c;并将其添加到lolipop游戏对象上。 5. 运行游戏, 棒棒糖由于Rigidbod…

专业120+总分400+宁波大学912信号与系统考研经验电子信息通信集成电路光电

今年考研顺利上岸&#xff0c;专业课912信号与系统120&#xff0c;总分400&#xff0c;被宁波大学录取&#xff0c;回望这一年的复习有过迷茫和犹豫&#xff0c;也有过坚持和坚强&#xff0c;总结一下自己的复习得失&#xff0c;希望对大家复习有所帮助。专业课&#xff1a; 前…

何为蓝海项目?抖音老隋分享的temu项目算吗?

在当今快速发展的商业环境中&#xff0c;蓝海项目成为了人们关注的焦点。那么&#xff0c;究竟什么是蓝海项目?抖音老隋分享的temu项目又是否算得上一个蓝海项目呢?本文将就此进行探讨。 首先&#xff0c;让我们明确什么是蓝海项目 蓝海项目通常指的是那些市场潜力巨大、竞争…

转盘寿司 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 寿司店周年庆&#xff0c;正在举办优惠活动回馈新老用户。 寿司转盘上总共有 n 盘寿司&#xff0c; prices[i] 是第 i 盘寿司的价格。 如果客户选择了第 i 盘寿…

pytorch 优化训练显存方式

转载自&#xff08;侵删&#xff09;&#xff1a; https://www.cnblogs.com/chentiao/p/17901639.html 1. 显存都用在哪儿了&#xff1f; 一般在训练神经网络时&#xff0c;显存主要被网络模型和中间变量占用。 网络模型中的卷积层&#xff0c;全连接层和标准化层等的参数占…

R语言【taxlist】——subset():取taxlist对象的子集

Package taxlist version 0.2.4 Description taxlist对象的子集将通过逻辑操作或模式匹配来完成。子集可以引用包含在插槽taxonNames、taxonRelations或taxonTraits中的信息。 Usage ## S4 method for signature taxlist subset(x,subset,slot "names",keep_child…

【游戏服务器部署】幻兽帕鲁服务器一键部署保姆级教程,游戏私服还是自己搭建的香

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。—幻兽帕鲁 想要…

ThinkPHP5.0.0~5.0.23反序列化利用链分析

本次测试环境仍然是ThinkPHP v5.0.22版本&#xff0c;我们将分析其中存在的一条序列化链。 一道CTF题 这次以一道CTF题作为此次漏洞研究的开头。题中涉及PHP的死亡绕过技巧&#xff0c;是真实环境中存在的情况。 $payload; $filename$payload.468bc8d30505000a2d7d24702b2cda…

春季选品策略:如何在Shopee平台上脱颖而出

在Shopee平台上进行春季选品时&#xff0c;卖家需要制定有效的策略来吸引消费者的注意并提高销售业绩。本文将介绍一些关键的选品策略&#xff0c;帮助卖家在春季市场中脱颖而出。 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#xff08;复制浏览器打开&#xf…

MyBatis 源码系列:MyBatis 解析配置文件、二级缓存、SQL

文章目录 解析全局配置文件二级缓存解析解析二级缓存缓存中的调用过程缓存中使用的设计模式 解析SQL 解析全局配置文件 启动流程分析 String resource "mybatis-config.xml"; //将XML配置文件构建为Configuration配置类 reader Resources.getResourceAsReader(re…

探索ESP32 C++ OOP开发:与传统面向过程编程的比较

探索ESP32 OOP开发&#xff1a;与传统面向过程编程的比较 在嵌入式系统开发中&#xff0c;ESP32是一个强大的平台&#xff0c;可以应用于各种项目和应用场景。在编写ESP32代码时&#xff0c;我们可以选择使用面向对象编程&#xff08;OOP&#xff09;的方法&#xff0c;将代码…

数据结构—栈实现前缀表达式的计算

前缀表达式计算 过程分析 中缀表达式&#xff1a;&#xff08;1 5&#xff09;*3 > 前缀表达式&#xff1a;*153 &#xff08;可参考这篇文章&#xff1a;中缀转前缀&#xff09; 第一步&#xff1a;从右至左扫描前缀表达式&#xff08;已存放在字符数组中&#xff09;&a…