Java-并发高频面试题

news2024/9/22 19:28:33

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.coloradmin.cn/o/1421397.html

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

相关文章

面试题:MySQL数据库索引失效的10连问你学会了吗?

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

【2024.1.30练习】李白打酒加强版(25分)

题目描述 题目思路 在最多数据的情况下,有100个店100朵花,总情况为的天文数字,暴力枚举已经不可能实现,考虑使用动态规划解决问题。最后遇到的一定是花,所以思路更倾向于倒推。 建立二维数组,容易联想到为…

vxe-table从2.0升级到3.0,vxe-table-plugin-virtual-tree虚拟滚动失效

问题:系统一直使用的vxe-table2.0,vxe-table2.0不支持树的虚拟滚动,为了解决这个问题,引入了vxe-table-plugin-virtual-tree插件,现在系统vxe-table升级3.0,vxe-table-plugin-virtual-tree的虚拟滚动失效了…

【MySQL】学习如何通过DQL进行数据库数据的条件查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-63IIm2s5sIhQfsfy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

2024年【T电梯修理】及T电梯修理复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理是安全生产模拟考试一点通总题库中生成的一套T电梯修理复审模拟考试,安全生产模拟考试一点通上T电梯修理作业手机同步练习。2024年【T电梯修理】及T电梯修理复审模拟考试 1、【多选题】工作结束跨…

Windows驱动开发之环境搭建,长期Waiting for connecting...思路

Windows驱动开发之环境搭建 1、前期准备 Vmware虚拟机软件 Windows10 iso安装包 Visual Studio2022 IDE软件 SDK安装(一定要勾选上debug选项,windbg在里面) WDK(Windows驱动程序工具包) WDK安装请参考官方文档&…

人人都可配置的大屏可视化

大屏主要是为了展示数据和酷炫的效果,布局大部分是9宫格,或者在9宫格上做的延伸,现在介绍下 泛积木-低代码 提供的大屏可视化配置。 首先查看效果展示 泛积木-低代码大屏展示。 创建页面之后,点击进入编辑页面,在可视…

初识命令执行【简介、工作原理和利用方式】

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 0、前言 本文看完如果想对应实战相关内容,可…

openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表

文章目录 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表211.1 禁止操作211.2 高危操作 openGauss学习笔记-211 openGauss 数据库运维-高危操作一览表 各项操作请严格遵守指导书操作,同时避免执行如下高危操作。 211.1 禁止操作 表1中描述在产品的操…

纯html+css+js静态汽车商城

首页代码 <!DOCTYPE html> <html class"no-js" lang"zxx"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

Datawhale 组队学习之大模型理论基础Task9 大模型法律

第11章 大模型法律 11.1 简介 此内容主要探讨法律对大型语言模型的开发和部署有何规定。 先看看法律的特点&#xff1a; 法律就如我国法律教材所给出的一样&#xff0c;有依靠国家强制力保证实施的特点。 而法律在大模型中也是不可或缺的&#xff0c;缺少了法律的约束&…

【复现】Ivanti Connect Secure命令注入漏洞(CVE-2024-21887)_33

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Ivanti Connect Secure&#xff08;9.x、22.x&#xff09;和 Ivanti Policy Secure&#xff08;9.x、22.x&#xff09;的 Web 组件…

java8 Duration类学习

Duration类 官网地址 基于时间的时间量&#xff0c;例如“34.5秒”。 此类以秒和纳秒为单位对时间的量或量进行建模。它可以使用其他基于持续时间的单位访问&#xff0c;如分钟和小时。此外&#xff0c;可以使用DAYS单位&#xff0c;并将其视为完全等于24小时&#xff0c;从…

如何利用故障根因分析快速定位故障原因?

「 背 景 」 众所周知&#xff0c;变更是线上环境不稳定的⾸要因素&#xff0c;有研究表明&#xff0c;线上70%的故障都是由某种变更⽽触发的。因此&#xff0c;当⽣产环境发⽣故障产⽣告警时&#xff0c;管理员第⼀直觉是怀疑近期是否发⽣过变更。此时&#xff0c;我们往往需…

Linux ---- Shell编程之正则表达式

一、正则表达式 ​ 由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通配符不同&#xff0c;通配符功能是用…

C++ 数论相关题目 博弈论:拆分-Nim游戏

给定 n 堆石子&#xff0c;两位玩家轮流操作&#xff0c;每次操作可以取走其中的一堆石子&#xff0c;然后放入两堆规模更小的石子&#xff08;新堆规模可以为 0 &#xff0c;且两个新堆的石子总数可以大于取走的那堆石子数&#xff09;&#xff0c;最后无法进行操作的人视为失…

如何在win系统部署Apache服务并实现无公网ip远程访问

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

MySQL解决 恢复从备份点到灾难点之间数据(不收藏找不到了)

CSDN 成就一亿技术人&#xff01; 今天分享一期 mysql中 备份之后发生灾难造成数据丢失 那么如何恢复中间的数据呢&#xff1f; 数据库数据高于一切&#xff08;任何数据是不能丢失的&#xff09; CSDN 成就一亿技术人&#xff01; 目录 1.准备测试数据库 2.备份数据库 观…

CCF-CSP 202312-1 仓库规划(Java、C++、Python)

文章目录 仓库规划问题描述输入格式输出格式样例输入样例输出子任务 满分代码JavaCPython 仓库规划 问题描述 西西艾弗岛上共有 n n n 个仓库, 依次编号为 1 ⋯ n 1 \cdots n 1⋯n 。每个仓库均有一个 m m m 维向量的位置编码, 用来表示仓库间的物流运转关系。 具体来说,…

机器学习 | 掌握 K-近邻算法 的理论实现和调优技巧

目录 初识K-近邻算法 距离度量 K值选择 kd树 数据集划分 特征预处理 莺尾花种类预测(实操) 交叉验证与网格搜索 初识K-近邻算法 K-近邻算法&#xff08;K-Nearest Neighbor&#xff0c;KNN&#xff09;是一种基本的分类和回归算法。它的基本思想是通过找出与新对象最近…