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

server/2024/9/25 3:18:16/
  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.ppmy.cn/server/42861.html

相关文章

springmvc中HandlerMapping是干什么用的

HandlerMapping处理器映射器 作用是根据request找到相应的处理器Handler和Interceptors,然后封装成HandlerExecutionChain对象返回 HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; 实现类 HandlerMapping帮助DispatcherServlet进…

Rust 赋能前端 -- 写一个 File 转 Img 的功能

所有耀眼的成绩,都需要苦熬,熬得过,出众;熬不过,出局 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 Rustwasm-bindgen/js-sys/web-sysWeb WorkerWebAssemblyWebpack/Vite配置WebAssemblyOffscreenCanvas脚手架生成项…

PHP质量工具系列之php_CodeSniffer

PHP_CodeSniffer 是一组两个 PHP 脚本:主脚本 phpcs 对 PHP、JavaScript 和 CSS 文件进行标记,以检测是否违反定义的编码标准;第二个脚本 phpcbf 自动纠正违反编码标准的行为。PHP_CodeSniffer 是一个重要的开发工具,可以确保你的…

【Linux】LAMP集群分布式安全方案

LAMP集群分布式安全方案主要涉及确保Linux、Apache、MySQL和PHP(LAMP)组合构成的集群环境的安全性和稳定性。 本次实验通过网络层安全对防火墙配置:使用防火墙(如iptables或firewalld)来限制对集群的访问,只…

Unity vscode在mac上的编译环境设置

在settings.json文件中配置以下信息。 settings.json路径一般在/Users/xxx/Library/Application Support/Code/User/settings.json {"omnisharp.useGlobalMono": "always","editor.fontLigatures": false,"omnisharp.useModernNet": …

算法打卡 Day9(字符串KMP 算法)-实现 strStr+ 重复的子字符串

KMP 算法 KMP 算法解决的是字符串匹配的问题,其经典思想是:当出现的字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。 前缀表 next 数组就是一个前缀表。前缀表是用来回退的&#xff0c…

自然资源-中华人民共和国土地管理法实施条例(2021年修订)

中华人民共和国土地管理法实施条例(2021年修订) 中华人民共和国土地管理法实施条例 (1998年12月27日中华人民共和国国务院令第256号发布 根据2011年1月8日《国务院关于废止和修改部分行政法规的决定》第一次修订 根据2014年7月29日《国务院…

c++11 标准模板(STL)本地化库 - 平面类别(std::numpunct_byname) 表示系统提供的具名本地环境的 std::numpunct

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 表示系统提供的具名本地环境的 std::numpunct std::numpunct_byn…