Java面试八股之可重入锁ReentrantLock是怎么实现可重入的

  1. 可重入锁ReentrantLock是怎么实现可重入的

ReentrantLock实现可重入性的机制主要依赖于以下几个核心组件和步骤:

状态计数器:ReentrantLock内部维护一个名为state的整型变量作为状态计数器,这个计数器不仅用来记录锁是否被持有,还记录了锁被重入的次数。当线程首次获取锁时,state值加1;每次线程重新进入同步块,state值继续递增。

线程局部变量:为了跟踪哪个线程持有锁,ReentrantLock使用了线程局部变量(ThreadLocal)来存储持有锁的线程标识和重入次数。这样,每当线程尝试获取锁时,可以快速判断当前锁是否由自己持有。

CAS操作:在尝试获取锁时,ReentrantLock使用了Compare-And-Swap(CAS)原子操作来修改state计数器,这是一种非阻塞同步技术,能够保证操作的原子性和一致性。如果当前锁未被持有(state为0),或者锁由当前线程持有(state大于0),CAS操作会尝试增加state的值,从而成功获取或重入锁。

锁的释放:当线程退出同步代码块并调用unlock()方法时,state计数器会递减。如果递减后state变为0,表示锁已经被完全释放,此时会唤醒在锁的等待队列中的其他线程。

总结来说,ReentrantLock通过维护一个状态计数器来记录锁的持有状态和重入次数,结合线程局部变量来识别锁的持有者,并利用CAS操作实现非阻塞的锁获取和释放,从而高效地支持了可重入特性。这种设计允许同一个线程在没有释放锁的情况下反复进入同步代码块,而不会产生死锁,同时也保持了锁操作的高性能。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

Java进阶学习笔记9——子类中访问其他成员遵循就近原则

正确访问成员的方法。 在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的。 F类: package cn.ensource.d13_extends_visit;public class F {String name "父类名字";public void print() {System.out.p…

langchian进阶二:LCEL表达式,轻松进行chain的组装

LangChain表达式语言-LCEL,是一种声明式的方式,可以轻松地将链条组合在一起。 你会在这些情况下使用到LCEL表达式: 流式支持 当你用LCEL构建你的链时,你可以得到最佳的首次到令牌的时间(输出的第一块内容出来之前的时间)。对于一些链&#…

Springboot+Vue项目-基于Java+MySQL的酒店管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

因说错一句话,京东实习生转正12天被辞退

大家好,我是程序员小灰。 就在昨天,我的老东家京东被爆出了一个大瓜,有一个刚刚加入京东的应届生,仅仅转正12天就被辞退了。 是谁这么倒霉?为什么被辞退呢? 事情的起因是京东新近推出的考评制度。根据京东的…

Spring Boot集成Banner快速入门demo

1.banner介绍 Spring Boot Banner 是一个用于在应用程序启动时显示自定义 ASCII 艺术和信息的功能。这个 ASCII 艺术通常包括项目名称、版本号、作者信息等。Banner 的主要作用是增强应用程序的品牌标识,同时提供一种友好的欢迎方式,让用户或开发人员在…

手撕算法|斯坦福大学教授用60页PPT搞定了八大神经网络

人工智能领域深度学习的八大神经网络常见的是以下几种 1.卷积神经网络(CNN): 卷积神经网络是用于图像和空间数据处理的神经网络,通过卷积层和池化层来捕捉图像的局部特征,广泛应用于图像分类、物体检测等领域。 2.循…

blender 布尔运算,切割模型。

1.创建一个立方体和球体。 2.选中立方体,在属性面板添加布尔修改器。点击物体属性右边的按钮选中球体。参数如下。 3.此时隐藏球体,就可以看到被切掉的效果了。

【算法】前缀和算法——和可被K整除的子数组

题解:和可被K整除的子数组(前缀和算法) 目录 1.题目2.前置知识2.1同余定理2.2CPP中‘%’的计算方式与数学‘%’的差异 及其 修正2.3题目思路 3.代码示例4.总结 1.题目 题目链接:LINK 2.前置知识 2.1同余定理 注:这里的‘/’代表的是数学…

MySQL云数据库5.5导入到自建MySQL数据库5.7补充

之前写过一篇关于MySQL云数据库5.5导入到自建MySQL数据库5.7的文章。 最近又搞了一次MySQL5.5导入5.7,发现有些细节需要补充。 这里mysql都是linxu系统的服务器。 1.使用mysqldump备份MySQL5.5再使用mysql导入mysql会报错。 解决方法:分两步走。 先使用mysqldu…

Creating Server TCP listening socket *:6379: listen: Unknown error

错误: 解决方法: 在redis安装路径中打开cmd命令行窗口,输入 E:\Redis-x64-3.2.100>redis-server ./redis.windows.conf结果:

动态链接学习总结

背景 之前了解了静态链接的原理,就想着把动态链接的原理也学习一下,提高编程能力。 关键知识点 动态链接的工作原理: 编译时的处理: 当程序被编译时,编译器知道程序需要某些库函数,但并不把这些函数的代…

JAVA学习-练习试用Java实现“螺旋矩阵”

问题: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入&#…

【C++】C++11(一)

C11是一次里程碑式的更新,我们一起来看一看~ 目录 列表初始化:{ }初始化:std::initializer_list: 声明:auto:decltype: STL的一些变化: 列表初始化: { }初始化&#xf…

学习记录16-反电动势

一、反电动势公式 在负载下反电势和端电压的关系式为:𝑈𝐼𝑅𝐿*(𝑑𝑖 / 𝑑𝑡)𝐸 E为线圈电动势、 𝜓 为磁链、f为频率、N…

博客说明 5/12~5/24【个人】

博客说明 5/12~5/24【个人】 前言版权博客说明 5/12~5/24【个人】对比最后 前言 2024-5-24 13:39:23 对我在2024年5月12日到5月24日发布的博客做一下简要的说明 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作…

python水果分类字典构建指南

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、理解需求 三、构建字典 1. 数据结构选择 2. 代码实现 3. 结果展示 四、总…

2024年31省市数字政府建设工作重点

目前,全国各省、市、自治区政府工作报告已经全部出炉,数字政府建设、营商环境优化依然成为各地政府工作报告的重要组成部分,“高效办成一件事”、“一网通办”、“数据治理”等热词亮点频出,政务服务通过“效能高”“落地稳”“靶…

【Sync FIFO介绍及基于Verilog的实现】

Sync FIFO介绍及实现 1 Intro2 Achieve2.1 DFD2.2 Intf2.3 Module 本篇博客介绍无论是编码过程中经常用到的逻辑–FIFO;该FIFO是基于单时钟下的同步FIFO; FiFO分类:同步FiFO VS 异步FiFO; 1 Intro FIFO可以自己实现,但…

使用pygame绘制图形

参考链接:https://www.geeksforgeeks.org/pygame-tutorial/?reflbp 在窗口中绘制单个图形 import pygame from pygame.locals import * import sys pygame.init()window pygame.display.set_mode((600,600)) window.fill((255,255,255))# pygame.draw.rect(wind…

高开高走的续作,可不止《庆余年2》

说起最近霸屏的影视剧,莫过于《庆余年2》。火爆全网的讨论度总归是没有辜负观众们五年的等待,在五月的影视市场独占鳌头已成定局。张若昀、陈道明、李沁等一众演员稳定发挥,剧情节奏随着故事发展渐入佳境,评分一路高涨。 对影视作…