面试小札:闪电五连鞭_7

1. 为什么非公平锁的吞吐量大于公平锁?

    公平锁:公平锁的获取遵循先来先服务的原则。线程在获取锁时,如果锁被其他线程占用,它会进入队列等待,当锁可用时,队列中的第一个线程会获取到锁。这种机制保证了每个线程按照请求锁的顺序依次获得锁,但是频繁的队列操作(如入队、出队)会带来一定的性能开销。

    非公平锁:非公平锁在获取锁时,不会考虑线程的等待顺序。当锁释放时,新请求锁的线程有机会直接获取锁,而不是先检查等待队列。这样减少了线程切换和队列操作的开销。因为它允许插队行为,在高并发场景下,线程有更多机会直接获取锁并执行任务,从而减少了等待时间,提高了整体的吞吐量。

2. synchronized的原理是什么?

    在Java中,synchronized是一种内置的锁机制。它可以修饰方法或者代码块。

    当修饰方法时,字节码层面会有一个ACC_SYNCHRONIZED标志位。当方法被调用时,执行线程会检查方法的ACC_SYNCHRONIZED访问标志是否被设置。如果设置了,执行线程会先获取锁,然后执行方法体,方法执行完后再释放锁。

    当修饰代码块时,通过monitorenter和monitorexit指令实现。monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置和异常处理的位置。线程执行到monitorenter指令时,会尝试获取对象的监视器(monitor)锁。如果获取成功,就可以执行同步代码块,执行完后通过monitorexit指令释放锁。每个对象都有一个与之关联的监视器,它就像一个特殊的区域,同一时刻只能有一个线程持有该对象的监视器锁。

3. ReentrantLock的原理是什么?

    ReentrantLock是一个可重入的互斥锁。它实现了Lock接口。

    内部通过一个抽象的同步器(AbstractQueuedSynchronizer,AQS)来实现。AQS维护了一个等待队列,当线程尝试获取锁时,如果锁已经被其他线程持有,该线程会被包装成一个节点加入到等待队列中。

    它使用state变量来表示锁的状态,state为0表示锁未被占用,大于0表示锁被占用,并且记录了重入的次数。当一个线程获取锁时,通过CAS(Compare - And - Swap)操作尝试将state从0变为1,如果成功,就获取到了锁。如果是已经获取到锁的线程再次获取锁,state会递增,表示重入。

    当线程释放锁时,会通过CAS操作将state递减,当state变为0时,锁才真正被释放,并且会唤醒等待队列中的一个线程。

4. 什么是分段锁?

    分段锁是一种用于提高并发性能的锁机制。主要应用在如ConcurrentHashMap等数据结构中。

    它将数据结构分成多个段(segment),每个段都有自己独立的锁。例如,在ConcurrentHashMap中,它内部默认将数据分成16个段。

    当多个线程对不同段的数据进行操作时,它们可以并发地进行,因为不同段的锁是相互独立的。这样可以大大提高在高并发场景下对数据结构的操作效率,相比于对整个数据结构使用一个锁,分段锁能够在保证线程安全的同时,允许更高程度的并发访问。

5. 在什么时候应该使用可重入锁?

    当需要手动控制锁的获取和释放时,ReentrantLock(可重入锁)是一个很好的选择。例如,在复杂的业务逻辑中,需要在方法的不同部分灵活地获取和释放锁。

    当需要实现公平锁或非公平锁的特性时,ReentrantLock可以通过构造函数来指定是公平锁还是非公平锁。如果业务场景对锁的获取顺序有要求,比如需要按照请求的先后顺序来获取锁,就可以使用公平锁模式的ReentrantLock。

    在需要进行一些高级功能如尝试获取锁(tryLock)、可中断地获取锁(lockInterruptibly)的场景下。例如,在一个线程可能需要等待一定时间获取锁,如果超时则放弃等待,或者线程在等待锁的过程中可以被中断的情况下,ReentrantLock的这些功能就很有用。

6. synchronized和volatile的区别是什么?

语义方面:

    synchronized用于保证在同一时刻只有一个线程可以访问被它修饰的方法或者代码块,实现了互斥访问,从而保证了原子性、可见性和有序性。

    volatile主要用于保证变量的可见性和禁止指令重排序。它确保一个线程对共享变量的修改能及时被其他线程看到,但不能保证原子性。

应用场景方面:

    synchronized适用于多个线程访问共享资源,并且需要对共享资源进行复杂的操作,如读写操作都包含的情况。

    volatile适用于多个线程共享一个变量,并且这个变量的修改操作比较简单,如只有一个线程进行写操作,其他线程进行读操作的场景。

性能方面:

    在简单的变量共享场景下,volatile的性能通常比synchronized要好,因为它没有像synchronized那样涉及到锁的获取和释放等复杂操作。但是在复杂的并发场景下,synchronized提供的完整的同步机制可能是更合适的选择。

7. 多线程synchronized锁升级的原理是什么?

    在Java中,synchronized锁有偏向锁、轻量级锁和重量级锁三种状态,会根据不同的竞争情况进行升级。

    偏向锁:偏向锁的目的是在大多数情况下,锁总是由同一线程多次获取。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储偏向的线程ID。以后该线程进入和退出同步块时,不需要进行CAS操作来加锁和解锁,只需要简单地测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果测试成功,表示线程已经获得了锁。偏向锁的获取和释放几乎没有性能开销。

    轻量级锁:当有另外一个线程尝试竞争偏向锁时,偏向锁会升级为轻量级锁。轻量级锁通过CAS操作在对象头和栈帧中的锁记录之间交换数据来实现加锁。如果CAS操作成功,线程就获取到了轻量级锁。轻量级锁适用于线程交替执行同步块的情况,它的开销比重量级锁小,因为它避免了进入操作系统的内核态来实现互斥。

    重量级锁:当多个线程竞争轻量级锁,且自旋一定次数后仍然无法获取锁时,轻量级锁会升级为重量级锁。此时,线程会通过操作系统的互斥量(mutex)来实现互斥,这涉及到线程阻塞和唤醒等操作,会有比较大的性能开销。重量级锁主要用于高竞争的场景,保证线程安全。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四、网络层:数据平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

文章目录 零、导论0.1 网络层服务0.2 网络层的关键功能0.3 网络层:数据平面、控制平面0.4 传统方式:每一路由器(Per-router)控制平面0.5 传统方式:路由和转发的相互作用0.6 SDN方式:逻辑集中的控制平面0.7 …

Java每日一题(1)

给定n个数a1,a2,...an,求它们两两相乘再相加的和。 即:Sa1*a2a1*a3...a1*ana2*a3...an-2*an-1an-2*anan-1*an 第一行输入的包含一个整数n。 第二行输入包含n个整数a1,a2,...an。 样例输入 4 1 3 6 9 样例输出 117 答案 import java.util.Scanner; // 1:无…

(2024.12自用存档)Ubuntu20.04——DynSLAM运行命令

前面忘记记录了,大概记一下后面 看了很多大佬的文章(感谢!),包括但不限于以下参考文章: Ubuntu16.04编译dynslam总结-CSDN博客 ubuntu14.04 CUDA8.0 DynSLAM编译与运行-CSDN博客 【视觉SLAM十四讲】Pa…

【阅读笔记】Android AMS forcestop停止应用

根据这篇文章作的笔记 基于Android 12的force-stop流程分析_android forcestop-CSDN博客 在AMS中,停止指定的应用是一个常用的功能,在代码里可以看到 Override 6806 public void forceStopPackage(final String packageName, int userId) { 6807 …

uniapp连接蓝牙操作(蓝牙设备地锁)

介绍: 本文采用uni-app框架来创建一个简单的用户界面,用于搜索、连接和发送命令给蓝牙设备。 1.打开蓝牙适配器 function openBluetooth() {uni.openBluetoothAdapter({success() {uni.offBluetoothDeviceFound();// 监听新设备发现事件uni.onBlueto…

《拉依达的嵌入式\驱动面试宝典》—前言目录篇

《拉依达的嵌入式\驱动面试宝典》—前言&目录篇 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Lin…

【博弈模型】古诺模型、stackelberg博弈模型、伯特兰德模型、价格领导模型

博弈模型 1、古诺模型(cournot)(1)假设(2)行为分析(3)经济后果(4)例题 2、stackelberg博弈模型(产量领导模型)(1&#xff…

如何利用Python爬虫获得1688商品详情

在这个信息爆炸的时代,数据就像是一块块美味的奶酪,而爬虫就是我们手中的瑞士军刀。今天,我要带你一起潜入1688这个巨大的奶酪洞穴,用Python爬虫捞起那些香气四溢的商品详情。别担心,我们的工具箱里有各种各样的工具&a…

blender 制作莫比乌斯带

创建 Curve -> Cycle 在 Edit 模式下,选择: 选中两个点,按 delete 删除 Segment 如下选中: 选中最上面的点,然后按 E 将它拖到右边的点上。 按 R 旋转 90 度。 依次调整参数: 回到 Object 模式下&#x…

《云原生安全攻防》-- K8s安全框架:认证、鉴权与准入控制

从本节课程开始,我们将来介绍K8s安全框架,这是保障K8s集群安全比较关键的安全机制。接下来,让我们一起来探索K8s安全框架的运行机制。 在这个课程中,我们将学习以下内容: K8s安全框架:由认证、鉴权和准入控…

研华运动控制卡 (如PCI1245)单轴编辑路

问题描述: 单轴如何编辑路径? n 问题分析及处理办法– 步骤 在utility软件中,编辑路径和运行路径只能在多轴运动这个界面,而且,使用函数来加载路径Acm_GpLoadPath,也是需要多个轴 ​ 如果只运行一个轴,需…

LM芯片学习

1、LM7805稳压器 https://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn1852815231102873600&utm_sourcewechat_sessionhttps://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn18528…

ChromeOS 131 版本更新

ChromeOS 131 版本更新 1. ChromeOS Flex 自动注册 在 ChromeOS 131 中,ChromeOS Flex 的自动注册功能现已允许大规模部署 ChromeOS Flex 设备。与 ChromeOS 零接触注册类似,自动注册将通过组织管理员创建的注册令牌嵌入到 ChromeOS Flex 镜像中。这将…

electron打包linux环境

注意:新版的electron已经不支持在win上直接打包Linux的环境了,服务会卡住,会一直生成文件占用磁盘(我发现的时候占了我100G,而且文件夹很深,找了java代码while循环,好不容易删除的o(╥﹏╥)o) electron有一个专门打包的docker镜像&#xff0c…

【SAP FICO】物料分类账详述

系列文章目录 文章目录 系列文章目录前言一、必备基础1、标准价和移动平均价2、概念3、意义4、功能 二、工作原理三、差异的种类与来源1、采用S价可能产生的差异2、单层价格差异和多层价格差异 四、后台配置总结 前言 业务背景:中国会计准则规定,对存货…

电脑文档损坏:原因剖析和修复方法

在使用电脑的过程中,许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑,特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作: 在编…

使用国内镜像网站在线下载安装Qt(解决官网慢的问题)——Qt

国内镜像网站 中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/北京理工大学:http://mirror.bit.edu.cn/qtproject/ 南京大学:https://mirror.nju.edu.cn/qt腾讯镜像&…

活动预告|云原生创新论坛:知乎携手 AutoMQ、OceanBase、快猫星云的实践分享

近年来,云原生技术迅猛发展,成为企业数字化转型的关键动力,云原生不仅极大地提升了系统的灵活性和可扩展性,还为企业带来了前所未有的创新机遇。 12 月 28 日 知乎携手 AutoMQ、OceanBase 和快猫星云推出“云原生创新论坛”主题的…

02-2.python入门语法一变量与数据类型2

四、Python 整数数据类型 (一)整数的表示方式 1. 十进制表示 十进制是我们在日常生活中最常用的数字表示形式,由 0 到 9 这十个数字排列组合而成。 2. 二进制表示 二进制数由 0 和 1 这两个数字组成,在 Python 中,…

如果在 Swift 数组中寻找最大相邻差值的线性时间算法

文章目录 摘要问题描述解决方案Swift 代码实现代码解析测试用例及结果时间复杂度空间复杂度总结 摘要 本文探讨如何在未排序的数组中,通过线性时间算法找到排序后相邻元素之间的最大差值。我们采用桶排序的思想,给出一个高效的 Swift 实现,并…