JUC-并发面试题

一、基础

1、为什么要并发编程

  • 充分利用多核CPU的资源

2、并发编程存在的问题

  • 上下文切换:PU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
    • 线程创建和上下文切换的带来而外的开销
  • 线程安全
  • 死锁:线程A持有资源,线程B持有资源;他们都想申请对方的资源,这两个线程就会相互等待而进入死锁状态。(互相等待对方释放锁)
  • 资源限制

3、并发编程三要素-如何保证多线程的运行安全

  • 原子性:一个或多个操作要么同时成功要么同时失败(原子类、synchronized、lock)
  • 可见性:一个线程对共享变量修改,另一个线程能够立即看到(volatile、synchronized、Lock)
  • 有序性:程序执行顺序按照代码的先后顺序执行(volatile、Happens-before)(处理器可能指令重排)

4、并发和并行的区别

  • 并发:多个线程操作同一资源,CPU快速交替
  • 并行:多个处理器同时处理多个任务

5、同步方法和同步块,哪个是更好的选择

  • 同步块是更好的选择,因为它不会锁住整个对象。同步方法会锁住整个对象

  • 同步块更要符合开放调用的原则,只在需要锁住的代码块锁住相应的对象

  • 同步的范围越小越好

6、synchronized 底层实现原理

  • 同步方法块使用的是monitorenter和monitorexit,monitorenter指令指向同步代码块开始的位置,monitorexit指向同步代码块结束的位置;线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁

  • 同步方法:使用ACC_SYNCHRONIZED标识,指明该方法是一个同步方法

  • 本质是对一个对象的监视器( monitor )进行获取,而这个获取过程是排他的,也就是同一 时刻只能有一个线 程 获 取到由 synchronized 所保护对象的监视器

  • monitor对象存在每个java对象的对象头中

7、synchronized可重入原理

  • 重入锁是指一个线程获取到该锁之后,该线程可以继续获得该锁。底层原理维护一个计数器,当线程获取该锁时,计数器加一,再次获得该锁时继续加一,释放锁时,计数器减一,当计数器值为0时,表明该锁未被任何线程所持有,其它线程可以竞争获取锁。

8、synchronized锁升级

  • 锁的升级的目的:锁升级是为了减低了锁带来的性能消耗
  • Synchronized 在jdk1.6 版本之前,是通过重量级锁的方式来实现线程之间锁的竞争。之所以称它为重量级锁,是因为它的底层底层依赖操作系统的Mutex Lock 来实现互斥功能。Mutex 是系统方法,由于权限隔离的关系,应用程序调用系统方法时需要切换到内核态来执行。这里涉及到用户态向内核态的切换,这个切换会带来性能的损耗。
    • 偏向锁,就是直接把当前锁偏向于某个线程,简单来说就是通过CAS 修改偏向锁标记,这种锁适合同一个线程多次去申请同一个锁资源并且没有其他线程竞争的场景。
    • 轻量级锁也可以称为自旋锁,基于自适应自旋的机制,通过多次自旋重试去竞争锁。自旋锁优点在于它避免避免了用户态到内核态的切换带来的性能开销。
  • synchronized 会尝试使用偏向锁的方式去竞争锁资源,如果能够竞争到偏向锁,表示加锁成功直接返回。如果竞争锁失败,说明当前锁已经偏向了其他线程。需要将锁升级到轻量级锁,在轻量级锁状态下,竞争锁的线程根据自适应自旋次数去尝试抢占锁资源,如果在轻量级锁状态下还是没有竞争到锁,就只能升级到重量级锁,在重量级锁状态下,没有竞争到锁的线程就会被阻塞,线程状态是Blocked。

9、synchronized锁优化

锁存在四种状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,随竞争而升级,不可降级。

  • 偏向锁:据统计,大部分锁80%的时间只有一个线程获取。当一个线程首次获得锁时,它会在对象头中记录下这个线程的ID,这样下次这个线程再尝试获取锁时就可以无阻塞地直接获取。
    • 锁撤销:需要等待全局安全点
  • 轻量级锁:自旋获取锁
  • 自旋锁:如果一个线程尝试获取该锁,它会一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。默认十次
  • 适应性自旋锁:一种特殊的自旋锁,其自旋的时间不再固定,而是根据前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定。
  • 锁消除:虚拟机在编译的时候检测到共享数据不可能存在竞争,执行锁消除
  • 锁粗化:频繁的加锁和解锁会造成性能损失,把锁同步的范围扩大。

10、volatile的作用

  • 可见性:当一个线程修改了一个volatile变量的值,会将这个值刷新到主内存中,并且会使用某种机制通知其他线程该变量发生变化。其他线程需要读取这个变量时,则会去主内存中读取最新的值。volatile的底层原理其实就是通过lock信号和MESI协议通知所有的处理器缓存失效,并且把数据更新到了内存。
  • 有序性:happens-before

11、synchronized 和 volatile 的区别是什么?

  • synchronized 表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。
  • volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变量的可见性;禁止指令重排序。
  • volatile 是变量修饰符;synchronized 可以修饰类、方法、变量。

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

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

相关文章

感觉是什么,AI回答的结果

感觉是一种主观的心理体验,通常是通过感官对外界刺激的反应而产生的。它可以是对外部环境的感知,如温度、光线、声音等,也可以是对内部心理状态的体验,如喜悦、悲伤、愤怒等。 感觉是一种直接的心理体验,具有主观性和…

一个三极管引脚识别的小技巧,再也不用对照手册啦

三极管是一个非常常用的器件,时不时的就需要用到他们,有些时候当我们拿到一颗三极管时 ,对于常用的友来说,三极管的引脚可能早已烂熟于心,而对于不常用或者初学者来说,三极管的引脚可以说是今天记下明天忘&…

【力扣每日一题】力扣94二叉树的中序遍历

题目来源 力扣94二叉树的中序遍历 题目概述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 思路分析 就是简单的树的中序遍历,使用递归和迭代的方式都可以实现。 代码实现 java实现 java使用迭代方式实现 public class Solution {publi…

Pytorch卷积层原理和示例 nn.Conv1d卷积 nn.Conv2d卷积

内容列表 一,前提 二,卷积层原理 1.概念 2.作用 3. 卷积过程 三,nn.conv1d 1,函数定义: 2, 参数说明: 3,代码: 4, 分析计算过程 四,nn.conv2d 1, 函数定义 2, 参数: 3, 代码 4, 分析计算过程 …

面了滴滴的数据分析师(实习),几道面试题都是原题啊。。。

年前,技术群组织了一场数据类的技术&面试讨论会,邀请了一些同学分享他们的面试经历,讨论会会定期召开,如果你想加入我们的讨论群或者希望要更详细的资料,文末加入。 喜欢本文记得收藏、关注、点赞 。技术交流文末…

Hadoop-Yarn-启动篇

一、源码下载 下面是hadoop官方源码下载地址,我下载的是hadoop-3.2.4,那就一起来看下吧 Index of /dist/hadoop/core 二、脚本部分 1、start-yarn.sh 如果我们想单独启动Yarn会用到$HADOOP_HOME/sbin/start-yarn.sh,下面我们就看看start…

C++之继承

一,概念及用法 1)概念 首先我们来了解一下官方的概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类&a…

leetcode:131.分割回文串

树形结构: 切割到字符串的尾部,就是叶子节点。 回溯算法三部曲: 1.递归的参数和返回值: 参数字符串s和startIndex切割线 2.确定终止条件: 当分割线到字符串末尾时到叶子节点,一种方案出现 3.单层搜索…

使用R语言建立回归模型并分割训练集和测试集

通过简单的回归实例&#xff0c;可以说明数据分割为训练集和测试集的必要性。以下先建立示例数据: set.seed(123) #设置随机种子 x <- rnorm(100, 2, 1) # 生成100个正态分布的随机数&#xff0c;均值为2&#xff0c;标准差为1 y exp(x) rnorm(5, 0, 2) # 生成一个新的变…

【C语言】assert断言:保护程序的利器

在软件开发过程中&#xff0c;我们经常会遇到一些假设条件或者预期行为。例如&#xff0c;我们可能假设一个函数的输入参数必须在某个范围内&#xff0c;或者某个变量的值应该满足特定的条件。当这些假设或预期行为被打破时&#xff0c;程序可能会出现异常行为&#xff0c;甚至…

Java+SpringBoot:高校竞赛管理新篇章

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

梯度提升树系列9——GBDT在多任务学习中的应用

目录 写在开头1. 多任务学习的基础知识1.1 多任务学习的概念和优势1.1.1 概念1.1.2 优势1.2 GBDT在多任务学习中的角色1.2.1 GBDT的基本原理1.2.2 GBDT在多任务学习中的应用2. 实际应用案例和最佳实践2.1 如何设计多任务学习模型2.2 成功案例分享2.2.1 推荐系统2.2.2 金融风控2…

vue响应式解析

vue响应式是响应啥&#xff1f;是数据与函数之间的响应&#xff0c;是做不到数据和数据之间的响应的&#xff0c;比如 let count ref(0); let num ref(count.value * 2);count改变&#xff0c;并不会导致num一起改变&#xff0c;因为js做不到数据和数据之间响应&#xff0c;…

2024年Midjourney 付费订阅流程 | Midjourney 各版本介绍,使用虚拟信用卡支付买Midjourney流程指南

1.Midjourney介绍 Midjourney 是一款备受欢迎的人工智能生成图像工具&#xff0c;它可以通过输入文字描述&#xff0c;自动生成精美的图像。与许多其他图像生成工具不同&#xff0c;Midjourney 不需要安装任何软件&#xff0c;也不受个人电脑性能的限制&#xff0c;因为它运行…

73. 矩阵置零(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入&#xff1a; matrix [[1,1,1],[1,0,…

H5/CSS 笔试面试考题(41-50)

简述对于以下 HTML,下列选项中哪一个 CSS 选择器效果与其他的不同 ( )ABC A:span:first-child B:span:nth-child(0) C:span:nth-child(-n+1) D:span:nth-last-child(3) 面试通过率:46.0% 推荐指数: ★★★★ 试题难度: 初级 试题类型: 选择题 答案:b 解析:span:fi…

(五)elasticsearch 源码之查询流程分析

https://www.cnblogs.com/darcy-yuan/p/17039526.html 1.概述 上文我们讨论了es&#xff08;elasticsearch&#xff0c;下同&#xff09;索引流程&#xff0c;本文讨论es查询流程&#xff0c;以下是基本流程图 2.查询流程 为了方便调试代码&#xff0c;笔者在电脑上启动了了…

dx 理想windows安装docker 并且运行项目

安装docker地址&#xff1a; https://docs.docker.com/desktop/install/windows-install/ 安装后运行两个报错&#xff1a; 1.wsl 直接下载更新 该win库即可&#xff1a; https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi 2.报错 Hardware assiste…

S32 Design Studio PE工具配置GPIO

首先我们来讲最简单的GPIO配置 代码生成 按照下图步骤就能配置一个基本的GPIO口&#xff0c;在组件里面选择pin_mux&#xff0c;选中就能配置使能和方向&#xff0c;no pin routed就是没有配置的。GPIO口分ABCDE组&#xff0c;每组从0到最大的序号。 然后在functional prope…