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.hqwc.cn/news/441471.html

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

相关文章

MySQL原理(三)锁定机制

一、介绍: 1、锁的本质 业务场景中存在共享资源,多个进程或线程需要竞争获取并处理共享资源,为了保证公平、可靠、结果正确等业务逻辑,要把并发执行的问题变为串行,串行时引入第三方锁当成谁有权限来操作共享资源的判…

npm 淘宝镜像正式到期

由于node安装插件是从国外服务器下载,如果没有“特殊手法”,就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了,于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本,且同步频率…

使用AKStream对接gb28181

优点:功能比较多,C#开发的,容易修改,内嵌入了zlmk流媒体服务品,启动简单 缺点:sip对摄像头兼容还有问题,大华接入非常不稳定,注册等待时间久,对海康是正常,占…

npm 依赖自动更新,依赖废弃不再烦恼 | 开源日报 No.160

renovatebot/renovate Stars: 14.3k License: NOASSERTION Renovate 是一个自动化的依赖项更新工具,支持多平台和多语言。其主要功能包括获取自动生成的拉取请求来更新您的依赖项、通过定时运行减少噪音以及发现相关软件包文件等。该项目的关键特点和核心优势如下…

-1- Python环境安装

1、Python安装 1、Windows安装Python 进入python官网:Welcome to Python.org点击 download——>all releases;建议选择3.7.2版本(网页链接:Python Release Python 3.7.2 | Python.org);下拉&#xff0…

Redis五种数据类型及应用场景

1、数据类型 String(字符串,整数,浮点数):做简单的键值对缓存 List(列表):储存一些列表类型的数据结构 Hash(哈希):包含键值对的无序散列表,结构化的数据 Set(无序集合):交集,并集…

计算机设计大赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…

java常量和kotlin常量

在java中使用final声明常量在kotlin中使用const val声明常量 常量在编译为字节码后会直接把调用常量的地方直接替换为常量值,示例如下: public class ConstDemo {public static final String NAME "Even";private static final int ID 100…

Scrum敏捷研发管理全流程/scrum管理工具

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低,可帮助企业快速落地敏捷,提质增效、缩短周期、加速创新…

华为---STP(二)---STP报文和STP端口状态

目录 1. STP报文简介 1.1 Configuration BPDU 1.2 TCN BPDU 2. STP交换机端口状态 2.1 STP交换机端口状态表 2.2 STP交换机端口状态迁移过程图 2.3 STP交换机端口状态变化举例说明 3 引起的STP网络拓扑改变的示例 3.1 根桥出现故障 3.2 有阻塞端口的交换机根端口所在…

数学知识第六期 中国剩余定理

前言 中国剩余定理也要学好的哈,共勉!!! 一、中国剩余定理的介绍 中国剩余定理释义:又称“孙子定理”。1852年,英国来华传教士伟烈亚力将《孙子算经》中“物不知数”问题的解法传至欧洲。1874年&#xff…

springboot整合dubbo3 及其中遇到的坑

前言 之前以及了解过了springboot cloud 微服务的一系列框架,其中dubbo在3之前一直作为一款优秀的rpc框架存在(对标spring cloud中的feign组件),为此duboo3出以后,dubbo也逐渐变成了一个微服务整合平台,目前我进行学习的是个时候遇到很多坑dubbo x springboot 官方开发文档 环…