【juc】ReentrantLock的实现原理

news2024/11/14 3:05:50

目录

        • 1.说明
        • 2.锁的状态
        • 3.锁的实现方式
        • 4.AQS 的核心组件
        • 5.锁获取和释放的过程
          • 5.1 获取锁
          • 5.2 释放锁
        • 6.可重入性
        • 7.公平锁与非公平锁
        • 8.锁的中断响应

1.说明
  • 1.ReentrantLock 是 Java 中 java.util.concurrent.locks 包提供的一个可重入的互斥锁。
  • 2.它提供了与 synchronized 关键字类似的同步功能,但比 synchronized 更加灵活和强大。
  • 3.ReentrantLock 支持两种锁模式:公平锁非公平锁
2.锁的状态
  • 1.ReentrantLock 内部维护了一个锁的状态,用于表示锁是否被某个线程持有,以及被持有的次数。
  • 2.锁的状态通常用一个整数(通常是32位)来表示,其中高位的几位用于表示锁的状态,低位的几位用于记录重入的次数(即同一个线程持有锁的次数)。
3.锁的实现方式
  • 1.ReentrantLock 的实现依赖于底层的同步机制,如 AbstractQueuedSynchronizer(简称 AQS)。AQS 是一个用于构建锁或其他同步组件的框架,它定义了一套多线程访问共享资源的同步器。
4.AQS 的核心组件
  • 1.同步队列(Sync Queue):一个FIFO队列,用于存储等待获取锁的线程。
  • 2.状态字段(State):一个整数,用于表示锁的状态和重入次数。
  • 3.独占模式(Exclusive Mode):ReentrantLock 在默认情况下是独占锁,即一次只能有一个线程持有锁。
5.锁获取和释放的过程
5.1 获取锁
  • 1.尝试获取锁:当一个线程尝试获取锁时,它会首先尝试通过CAS(Compare-And-Swap)操作将锁的状态从“未锁定”(0)修改为当前线程的ID(或其他表示锁持有的值)。如果CAS操作成功,则线程成功获取锁,并增加重入次数。
  • 2.加入同步队列:如果CAS操作失败(即锁已被其他线程持有),则当前线程会被封装成一个节点(Node),并加入到同步队列的尾部。线程会进入一个自旋状态,不断尝试通过CAS操作获取锁,或者通过 park 方法挂起自己,等待被唤醒。
5.2 释放锁
  • 1.减少重入次数:当持有锁的线程释放锁时,它会首先减少重入次数。如果重入次数变为0,则锁的状态会被设置为“未锁定”。
  • 2.唤醒后继节点:如果锁状态变为“未锁定”,则持有锁的线程会唤醒同步队列中的下一个等待线程,使其有机会尝试获取锁。
6.可重入性
  • 1.ReentrantLock 是可重入的,这意味着同一个线程可以多次获取同一个锁而不会导致死锁。
  • 2.这是通过维护一个重入次数来实现的。
  • 3.每次线程获取锁时,重入次数加1;每次释放锁时,重入次数减1。
  • 4.只有当重入次数为0时,锁才会真正被释放。
7.公平锁与非公平锁
  • 1.公平锁:按照线程请求锁的顺序来分配锁,即先请求的线程先获得锁。这通常会导致较长的等待时间,但可以避免线程饥饿。
  • 2.非公平锁:不保证线程获取锁的顺序,可能会允许插队。这通常会导致较短的等待时间,但可能会导致线程饥饿。
8.锁的中断响应
  • 1.ReentrantLock 支持中断响应的锁获取操作。如果线程在尝试获取锁时被中断,它可以立即响应中断,而不是一直等待下去。

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

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

相关文章

Sam Altman:年底将有重磅更新,但不是GPT-5!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

zabbix监控端界面时间与服务器时间不对应

1. 修改系统时间 # tzselect Please select a continent, ocean, "coord", or "TZ".1) Africa2) Americas3) Antarctica4) Asia5) Atlantic Ocean6) Australia7) Europe8) Indian Ocean9) Pacific Ocean 10) coord - I want to use geographical coordina…

大数据新视界 -- 大数据大厂之 Impala 性能提升:高级执行计划优化实战案例(下)(18/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

P2356 弹珠游戏

铁子们好呀,博主好久没更新了,今天给大家更新一道编程题!!! 题目链接如下:P2356 弹珠游戏 好,接下来,我将从三个方面讲解这道例题。分别是 题目解析算法原理代码实现 文章目录 1.题…

项目管理十大知识领域:如何提升项目执行力

项目管理是一门复杂的学科,涉及到多个领域的知识与技能。有效的项目管理不仅能够确保项目按时、按质、按预算完成,还能提升团队协作、提高效率,甚至在面对风险和变化时保持项目的稳定性和成功率。项目管理十大知识领域是构建成功项目的基石&a…

【miniMax开放平台-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

HBuilder使用虚拟机

按文档的连接一直不成功 没找到Simulator,原来是因为我电脑之前没安装过虚拟机版本 安装模拟器Simulator | uni-app官网 找到settings,左下角安装需要的对应版本的虚拟机就好了,然后重启hb

vcenter service基本异常处理

服务:vcenter service 版本: 7.0.3 问题描述:无法访问vcenter ui 排障思路: 1. 登入vcenter所在服务器执行基础排查:内存、cpu、磁盘、网络等,发现磁盘日志目录已经爆满,删除180天前的日志恢…

WordPress中最佳的无障碍插件:入门级指南

在今天的互联网时代,网站对所有用户都友好和可访问是非常重要的。对普通用户,特别是对有视力、听力或其他障碍的用户,为他们提供无障碍的体验显得尤为重要。使用WordPress建立网站的用户,有一些非常好的插件可以帮助你轻松实现这一…

科技前沿:汽车智能玻璃,开启透明显示新纪元

根据QYResearch调研团队最新发布的《全球汽车智能玻璃市场报告2023-2029》显示,预计到2029年,全球汽车智能玻璃市场的规模将攀升至0.5亿美元,且在未来几年内,其年复合增长率(CAGR)将达到5.5%。 以下图表展…

基于Multisim信号波形发生器电路正弦波方波三角波锯齿波(含仿真和报告)

【全套资料.zip】正弦方波三角波锯齿波方波占空比可调频率可调电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.设计一个能够产生多个信号输出的信号发生器, 要求输出波形…

Spring Boot——日志介绍和配置

1. 日志的介绍 在前面的学习中,控制台上打印出来的一大堆内容就是日志,可以帮助我们发现问题,分析问题,定位问题,除此之外,日志还可以进行系统的监控,数据采集等 2. 日志的使用 在程序中获取日…

刘铁猛C#入门 024 类的声明,继承和访问控制

类声明的全貌 C#声明类的位置 声明既定义(C#与Java) 类的修饰符 最简单的类声明 类的访间控制 :默认internal 共性 public 和 internal 都是访问修饰符,用于定义一个类型的成员可以被谁访问。它们都可以用来声明类、结构、接口、枚举、字段、方法、…

人工智能(AI)对于电商行业的变革和意义

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/402a907e12694df5a34f8f266385f3d2.png#pic_center> 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代…

pgsql 版本升级和数据迁移(编译版)

最近给pgsql从16.0升级到16.4,有挺多细节 1.关闭pgsql 为了保证数据一致性和过渡平稳,还是需要暂停pgsql。 systemctl stop pgsql2.备份现有数据 需要切换到pgsql的用户,通常用root是不行的 pg_dumpall > /xxx/xxx/backup.sql3.重命名…

⚙️ 如何调整重试策略以适应不同的业务需求?

调整 Kafka 生产者和消费者的重试策略以适应不同的业务需求,需要根据业务的特性和容错要求来进行细致的配置。以下是一些关键的调整策略: 业务重要性: 对于关键业务消息,可以增加重试次数,并设置较长的重试间隔&#x…

uniCloud云对象调用第三方接口,根据IP获取用户归属地的免费API接口,亲测可用

需求 在2022年5月初,网络上各大平台上,都开始展示用户IP属地,在某音、某手等小视频平台以及各主流网站应用中,都展示IP归属地,如下图所示: 解决办法 收费文档的肯定有很多,基本你百度搜“归…

蓝桥杯PythonB组扫盲

题目分布(参考2024年省赛):总共八道题,两填空8代码(考察计算机基础知识和一些简单数学计算知识,不会太难,稍微准备下就行),六道程序设计题(重点和难点&#x…

STM32单片机WIFI语音识别智能衣柜除湿消毒照明

实践制作DIY- GC0196-WIFI语音识别智能衣柜 一、功能说明: 基于STM32单片机设计-WIFI语音识别智能衣柜 二、功能介绍: STM32F103C系列最小系统板LCD1602显示器ULN2003控制的步进电机(柜门开关)5V加热片直流风扇紫外消毒灯DHT11…

git重置的四种类型(Git Reset)

git区域概念 1.工作区:IDEA中红色显示文件为工作区中的文件 (还未使用git add命令加入暂存区) 2.暂存区:IDEA中绿色(本次还未提交的新增的文件显示为绿色)或者蓝色(本次修改的之前版本提交的文件但本次还未提交的文件显示为蓝色)显示的文件为暂存区中的文件(使用了…