多线程锁机制面试
目录
乐观锁的底层原理
ReentrantLock的实现原理
读写锁 ReentrantReadWriteLock
synchronized 底层原理
Lock和synchronized的区别
乐观锁的底层原理
-
版本号机制 在数据库表中添加一个版本号字段(如 version),每次更新数据时都会将版本号加1。 当尝试更新数据时,会检查当前版本号是否与开始操作时获取的版本号一致。 如果版本号一致,则更新成功;如果不一致,则表示数据已被其他事务修改,更新失败。
-
时间戳机制 类似于版本号机制,但在表中使用时间戳字段来记录数据的最后修改时间。 更新数据时,同样需要检查当前时间戳是否与开始操作时获取的时间戳一致。 如果时间戳一致,则更新成功;如果不一致,则表示数据已被其他事务修改,更新失败。
-
CAS 操作 CAS (Compare and Swap) 是一种无锁算法,用于原子地更新一个变量的值。 在多线程环境中,CAS 操作可以用来实现乐观锁。 CAS 操作通常由 CPU 提供硬件级别的支持,也可以通过软件模拟实现。
乐观锁的优点 减少了锁的竞争,提高了系统的吞吐量。 适用于读多写少的场景。
乐观锁的缺点 如果数据更新频繁,可能导致更新失败的次数增多,从而降低性能。 需要额外的字段存储版本号或时间戳
ReentrantLock的实现原理
ReentrantLock 是 Java 并发包(java.util.concurrent.locks)中提供的一个可重入互斥锁,它提供了比 synchronized 关键字更灵活的锁机制。其核心实现原理基于 AbstractQueuedSynchronizer(AQS)框架
实现原理: 可重入性:ReentrantLock 允许同一个线程多次获取锁而不被阻塞,通过内部维护一个计数器来记录锁被当前线程获取的次数。每次成功获取锁,计数器加1;每次释放锁,计数器减1,当计数器为0时,其他线程才能获取到锁。
公平性与非公平性: 公平锁(FairSync):按照请求锁的顺序来分配锁,先来的线程优先获取锁。实现这一点需要维持一个先进先出(FIFO)的等待队列,线程在尝试获取锁失败后会加入队列末尾等待。
非公平锁(NonfairSync):允许插队,即当前线程尝试获取锁时,即使有其他线程已经在等待队列中,只要锁当前是空闲的,就允许立即获取。这可以减少线程的上下文切换,提高吞吐量,但可能牺牲公平性。
自旋锁与AQS:ReentrantLock 在尝试获取锁时可能会使用自旋策略,即线程在无法立即获取锁时不是立即挂起而是循环等待一段时间,这尤其适用于锁持有时间很短的场景。AQS通过维护一个双向链表来管理等待线程,链表中的每个节点代表一个等待状态的线程,通过CAS操作来保证状态更新的原子性。
条件变量:ReentrantLock 还支持条件变量(Condition),允许线程在满足特定条件前等待,其他线程可以唤醒这些等待的线程。每个条件变量都有自己的等待队列。 锁的释放:释放锁时,不仅会减少锁的持有计数,还会唤醒等待队列中的下一个线程(如果有的话),这通常通过LockSupport类的park/unpark方法实现。
读写锁 ReentrantReadWriteLock
-
读写锁的基本概念 读锁: 多个读操作可以同时进行,不会互相阻塞。
-
写锁: 写操作是独占的,在写操作进行时不允许任何读操作。
-
ReentrantReadWriteLock 的特点 可重入性: 同一个线程可以多次获取同一个锁。 公平性: 可以选择公平锁或非公平锁。 读写分离: 读操作和写操作分别使用不同的锁。
-
ReentrantReadWriteLock 的使用 创建锁: 通过 ReentrantReadWriteLock 类创建读写锁实例。 获取锁: 通过 readLock() 和 writeLock() 方法分别获取读锁和写锁。 锁定与解锁: 使用 lock() 和 unlock() 方法来锁定和解锁。
synchronized 底层原理
synchronized 关键字在 Java 中用于实现线程间的互斥和同步,它基于 JVM 层面的监视器锁(Monitor)机制来实现。以下是 synchronized 的底层原理概述:
1.对象头(Object Header): Java 对象在内存中有一个对象头,其中包含了对象的元数据,如哈希码、GC代信息以及锁信息。 锁信息存储在一个称为 Monitor 的结构中,这个结构是 JVM 提供的,用来实现同步。
Monitor 监视器: 当一个线程试图进入一个由 synchronized 修饰的方法或代码块时,它会尝试获取该对象的 Monitor 锁。 如果锁是可用的,线程将进入临界区,并且锁状态会变为“已锁定”。 如果锁已经被其他线程持有,请求锁的线程将被阻塞,直到锁被释放。
字节码指令: 在字节码级别,synchronized 关键字会被转换为 monitorenter 和 monitorexit 指令。 monitorenter 指令会在执行前尝试获取锁,而 monitorexit 指令则在执行后释放锁。 这些指令操作的是对象头中的 Monitor 结构。
锁升级: 为了提高性能,JVM 实现了锁的升级机制。初始时,锁可能处于无锁状态,然后根据竞争情况升级为偏向锁、轻量级锁或重量级锁。 偏向锁适用于没有多个线程竞争的情况,轻量级锁使用 CAS 操作尝试获取锁,而重量级锁则涉及到操作系统级别的线程阻塞和唤醒。 即时编译优化: HotSpot VM 会对 synchronized 块进行优化,例如,如果检测到锁没有竞争,它可以避免使用重量级锁,从而减少上下文切换和线程调度的开销。
Lock和synchronized的区别
-
语法糖 vs 显式控制 synchronized: 是 Java 的关键字,提供了语法级别的支持,用于声明同步代码块或同步方法。 Lock: 是 java.util.concurrent.locks 包中的一个接口,需要显式地获取和释放锁。
-
锁的获取与释放 synchronized: 在进入同步代码块或方法时自动获取锁,并在退出时自动释放锁。 Lock: 需要显式地调用 lock() 方法获取锁,并且必须在不再需要锁时显式地调用 unlock() 方法释放锁。为了防止因异常而导致锁未被释放,通常将 unlock() 方法放在 finally 块中。
-
可重入性 synchronized: 具有可重入性,允许同一个线程多次获取同一个锁。 Lock: 也支持可重入性,但需要通过 ReentrantLock 类实现。
-
公平性 synchronized: 默认是非公平锁。 Lock: 可以通过 ReentrantLock 类的构造函数指定锁是否公平。
-
中断响应 synchronized: 无法响应中断请求,即使线程被中断,仍然持有锁。 Lock: 支持中断请求,可以通过 tryLock 方法尝试获取锁,并且可以监听中断信号。
-
锁状态的检查 synchronized: 无法检查锁是否被当前线程持有。 Lock: 可以通过 isHeldByCurrentThread() 方法检查当前线程是否持有锁。
-
等待/通知机制 synchronized: 直接使用 wait() 和 notify() 方法来实现线程间的等待/通知。 Lock: 通过 Condition 接口实现等待/通知机制,需要与 Lock 结合使用。
-
异常处理 synchronized: 在发生异常时会自动释放锁,因此不会出现死锁。 Lock: 发生异常时,如果没有显式地释放锁,可能会导致死锁。
相关文章:
多线程锁机制面试
目录 乐观锁的底层原理 ReentrantLock的实现原理 读写锁 ReentrantReadWriteLock synchronized 底层原理 Lock和synchronized的区别 乐观锁的底层原理 版本号机制 在数据库表中添加一个版本号字段(如 version),每次更新数据时都会将版本号…...
《SQL 中计算地理坐标两点间距离的魔法》
在当今数字化的世界中,地理数据的处理和分析变得越来越重要。当我们面对一个包含地理坐标数据的表时,经常会遇到需要计算两点之间距离的需求。无论是在物流配送路线规划、地理信息系统应用,还是在基于位置的服务开发中,准确计算两…...
微服务可用性设计
一、隔离 对系统或资源进行分割,实现当系统发生故障时能限定传播范围和影响范围。进一步的,通过隔离能够降低系统之间得耦合度,使得系统更容易维护和扩展。某些业务场景下合理使用隔离技巧也能提高整个业务的性能。我理解隔离本质就是一种解…...

【扒代码】dave readme文档翻译
jerpelhan/DAVE (github.com) 摘要 低样本计数器估算选定类别对象的数量,即使在图像中只有少量或没有标注样本的情况下。目前最先进的技术通过对象位置密度图的总和来估算总数量,但这种方法无法提供单个对象的位置和大小,这对于许多应用来说…...

c语言---文件
这一节我准备分三个部分来带领大家了解文件 ——一、有关文件的基础知识 ————二、文件的简单操作 ————————三、文件结束的判定 ————————————四、文件缓冲区 一、文件的基础知识: 首先在了解文件之前,我们需要了解C/C程序内存…...

Windows系统下Go安装与使用
step1: 下载go语言SDK 下载地址:https://go.dev/dl/ 下载后选择合适位置安装即可,我选择D盘 在安装完成后,可以通过go env 命令检测是否安装成功。在“命令提示符”界面输入“go env”命令,如果显示如下类似结果则说明…...

day24-测试之接口测试基础
目录 一、接口的定义 二、接口的优点 三、API接口 四、接口测试流程 五、网络基础概念 六、HTTP和RURL 七、get和post请求 八、数据格式 九、状态码 十、restful风格 十一、接口工具 一、接口的定义 程序之间协作所要遵循的一套规范、标准 二、接口的优点 2.1.责任…...
TSN 交换机
TSN(Time-Sensitive Networking)交换机是一种支持时间敏感网络协议的网络交换设备,用于在以太网网络中实现低延迟、高确定性的数据传输。TSN 是一组 IEEE 802 标准的集合,旨在通过标准化的方式,将传统的以太网扩展到需…...

针对thinkphp站点的漏洞挖掘和经验分享
0x1 前言 浅谈 目前在学习和研究thinkphp相关漏洞的打法,然后最近对于thinkphp资产的收集方面有了一个简单的认识,然后写一篇新手看的thinkphp相关的漏洞收集和挖掘的文章来分享下。然后后面是给师傅们分享下后台文件上传,然后直接打一个ge…...

MySQL数据库入门,pycharm连接数据库—详细讲解
一.安装MySQL 1.常用MySQL5.7,首先安装MySQL, (一) (二) (三) (四) (五) 2.配置环境变量 打开MySQL安装路径,在其中找到…...

.bat文件快速运行vue项目
如何使用bat文件快速运行vue项目? 新建个文件,改名为serve.bat。 在文件中写入以下内容: # cd 项目路径 cd D:\projects\xxx npm run serve pausecd 项目所在的路径 npm run dev/serve ,取决于项目的启动方法,打…...

数据结构(邓俊辉)学习笔记】优先级队列 07——堆排序
1.算法 作为完全二叉堆的一个应用,这节来介绍堆排序算法。 是的,谈到优先级队列,我们很自然地就会联想到排序。因为就其功能而言,包括完全二叉堆在内的任何一种优先级队列都天生地具有选取功能,也就是选取其中的最大…...

npm install pnpm -g 报错的解决方法
npm install pnpm -g 报错的解决方法 npm error code ETIMEDOUT npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/pnpm failed, reason: npm error network This is a problem related to network connectivity. npm error network In mo…...

集师知识付费小程序开发
智慧生活,从选择一款优质知识付费小程序起航 在这个信息爆炸的时代,知识成为了最宝贵的财富。我们渴望不断学习,提升自我,追求更高品质的生活。而一款优质的知识付费小程序,就如同照亮前行道路的明灯。 它是知识的宝库…...

前端开发提效工具——用户自定义代码片段
做开发总是会有大量的代码要写,但是有时候某些代码是非常基础但是很多,我们就可以把这一部分整合起来,使用一个很简短的关键字来快速唤出。 如何新建这样的代码段? 1.在VSCode当中找到Snippets,然后点击 2.之后会弹出…...

docker容器安全加固参考建议——筑梦之路
这里主要是rootless的方案。 在以 root 用户身份运行 Docker 会带来一些潜在的危害和安全风险,这些风险包括: 容器逃逸:如果一个容器以 root 权限运行,并且它包含了漏洞或者被攻击者滥用,那么攻击者可能会成功逃出容器…...

基于 Appium 的 App 爬取实战
除了运行 Appium 的基本条件外,还要一个日志输出库 安装: pip install loguru 思路分析 首先我们观察一下整个 app5 的交互流程,其首页分条显示了电影数据, 每个电影条目都包括封面,标题, 类别和评分 4…...
nvm与node安装
参考: 一文搞定NVM安装所有问题NVM UI解决nodejs下载慢问题 node_mirror: http://npmmirror.com/mirrors/node/ npm_mirror: http://registry.npmmirror.com/mirrors/npm/解决nvm list available报错问题 Could not retrieve https://npm.taobao.org/mirrors/node/…...

【电子通识】什么是MSL湿敏等级
潮敏失效是塑料封装表贴器件在高温焊接工艺中表现出来的特殊的失效现象。 造成此类问题的原因是器件内部的潮气膨胀后使得器件发生损坏。 MSL是“Moisture Sensitivity Level(湿气敏感性等级)”的缩写,针对需进行回流焊的产品设定了MSL基准。…...
【ARM 芯片 安全与攻击 5.4 -- Meltdown 攻击与防御介绍】
文章目录 什么是 Meltdown 攻击?Meltdown 攻击的基本原理Meltdown 攻击代码示例Meltdown 攻击在芯片中的应用应用场景Meltdown 攻击与瞬态攻击、测信道攻击的关系针对 Meltdown 攻击的防御硬件级防御Summary什么是 Meltdown 攻击? Meltdown 攻击是一种利用处理器乱序执行(o…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...

安宝特案例丨寻医不再长途跋涉?Vuzix再次以AR技术智能驱动远程医疗
加拿大领先科技公司TeleVU基于Vuzix智能眼镜打造远程医疗生态系统,彻底革新患者护理模式。 安宝特合作伙伴TeleVU成立30余年,沉淀医疗技术、计算机科学与人工智能经验,聚焦医疗保健领域,提供AR、AI、IoT解决方案。 该方案使医疗…...

运动控制--BLDC电机
一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换,典型应用于电动工具、玩具等 1.2 无刷直流电机(BLDC) 电子换向替代机械电刷,具有高可靠性,常用于无人机、高端家电…...