重入锁的进阶之路:从显式计数到三级缓存
说到重入锁可能很多人第一反应就是一个线程重复获取同一把锁不会卡死。但这里面的实现细节挺有意思的。独占锁的重入同一时刻只有一个线程能持有锁要实现重入只需要解决两个问题现在是谁拿着锁这个线程拿了几层常见有两种记法。显式计数最直接的做法就是找个变量记着。ReentrantLock和重量级Monitor用的都是这套owner 当前线程count简单粗暴但有效。隐式计数栈结构synchronized的轻量级锁路径有点不一样。它不单独存一个整数而是利用栈上的Lock Record。第一次进入同步块时线程会在栈上分配一个真正的Lock Record里面保存着对象头的原始Mark Word。后续重入怎么办再压一个栈帧但这次是个空的Lock Record什么都不存。所以栈上有几个空记录就表示重入了几次。退出的时候弹出空记录 → 只是退出一层不释放锁弹出非空记录 → 最外层到了该释放锁这就好比递归调用栈天然帮你计数省掉了额外维护计数器的成本。为什么要这么优化如果不优化每次重入都走完整的加锁流程复制对象头CAS改对象头竞争锁状态但锁本来就是你自己的根本没人和抢再CAS来CAS去纯属浪费。JVM聪明的地方就在于第一次真正加锁后面只做个我又进来了的标记。共享锁的重入共享锁比独占锁复杂一点。同一时刻可以有多个线程一起持有所以不仅要记总共有多少人在用还要记当前线程自己拿了几次。因为释放的时候必须校验这个线程到底持有几次还剩几次没释放完。三级缓存优化最直接的办法是每个线程都去ThreadLocal里查自己的次数能工作但有额外开销。而读锁最常见的场景是只有一个线程在读或者同一个线程连续读。所以JDK搞了三级优化从快到慢第一层firstReader第一个读线程直接用两个字段记录firstReader和firstReaderHoldCount。第二次重入直接就行连ThreadLocal都不用查。第二层cachedHoldCounter如果不是第一个读线程就看当前线程是不是上一次成功获取读锁的线程。如果是直接用缓存的那个计数对象省一次ThreadLocal.get。第三层ThreadLocalHoldCounter前两层都没命中才走最终方案从ThreadLocal里拿。为什么叫避免全局竞争因为每个线程的持有次数放到ThreadLocal里每个线程只碰自己的局部数据减少了共享热点的竞争。当然state本身还是共享的获取释放时还是要CAS改它。这是两码事。小结重入计数看起来简单但要考虑性能就各有各的玩法独占锁可以用显式count也可以用栈结构隐式计数共享锁要额外记每个线程自己的次数于是搞出了三级缓存

相关新闻

物联网架构——CDH集群部署与管理实验作业指导书

物联网架构——CDH集群部署与管理实验作业指导书

一、实验基本信息 实验名称 CDH集群部署与Kafka服务集成 实验时长 6课时 实验对象 大数据专业大三学生 前置要求 掌握Linux基本操作、Hadoop基础原理 实验目的 理解CDH的核心概念与优势,对比社区版Hadoop的差异 掌握CDH完全分布式集群的完整部署流程 熟练使用Cloudera…

2026/7/4 5:23:07 阅读更多 →
基于nodejs+vue的房产房屋租赁系统

基于nodejs+vue的房产房屋租赁系统

目录技术选型与架构设计核心功能模块开发流程关键代码示例注意事项项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 后端(Node.js) 框架:Expres…

2026/5/17 1:42:14 阅读更多 →
当碳捕集电厂遇上“会跳舞“的负荷:一场多时间尺度的低碳博弈

当碳捕集电厂遇上“会跳舞“的负荷:一场多时间尺度的低碳博弈

内容:挖掘源荷两侧低碳资源并分析其低碳性,荷侧调用不同响应速度的价格型、激励型需求响应资源克服多时间尺度下碳捕集电厂综合灵活运行方式的局限,通过源荷资源协调优化,从而提高系统的低碳性能。 文献:#计及碳捕集电…

2026/5/17 9:26:45 阅读更多 →

最新新闻

Stable Diffusion 3 图像生成实战:基于《穿石棉的人》描绘未来废墟的 5 个提示词工程技巧

Stable Diffusion 3 图像生成实战:基于《穿石棉的人》描绘未来废墟的 5 个提示词工程技巧

Stable Diffusion 3 图像生成实战:基于《穿石棉的人》描绘未来废墟的 5 个提示词工程技巧当科幻文学中的"沉寂的百老汇"、"永恒的衰败"这类抽象描述遇上Stable Diffusion 3的生成能力,我们面对的不仅是技术实现问题,更是…

2026/7/6 12:35:16 阅读更多 →
字节面试复盘2026/07/03

字节面试复盘2026/07/03

复盘来自2026/07/03 字节扣子编程开发 人生首面~~~1.流式输出是怎么实现的 1. 核心原理 流式输出本质是HTTP分块长连接,区别普通一次性响应:普通接口等后端处理完返回完整JSON;流式是大模型边生成文字、后端边分段推送,前端边接收…

2026/7/6 12:35:16 阅读更多 →
TPAFE0808与MKV44F256VLH16构建多通道信号采集系统

TPAFE0808与MKV44F256VLH16构建多通道信号采集系统

1. 项目背景与核心需求在工业自动化、医疗设备和消费电子领域,多通道信号采集与系统监测一直是关键需求。TPAFE0808作为一款8通道模拟前端芯片,搭配MKV44F256VLH16这款高性能微控制器,能够构建一套稳定可靠的多通道信号处理系统。这套组合特别…

2026/7/6 12:33:13 阅读更多 →
灰度共生矩阵 (GLCM) 实战:Python 提取 4 大纹理特征,准确率提升 15%

灰度共生矩阵 (GLCM) 实战:Python 提取 4 大纹理特征,准确率提升 15%

灰度共生矩阵(GLCM)实战:Python提取4大纹理特征提升分类准确率纹理分析一直是计算机视觉领域的重要研究方向,想象一下你正在开发一个木材质量检测系统,如何让机器像经验丰富的质检员一样,通过表面纹理判断木材等级?这正…

2026/7/6 12:33:13 阅读更多 →
协方差矩阵与皮尔森相关系数:从2维到N维数据的3步可视化分析实战

协方差矩阵与皮尔森相关系数:从2维到N维数据的3步可视化分析实战

协方差矩阵与皮尔森相关系数:从2维到N维数据的3步可视化分析实战在数据科学和机器学习领域,理解变量之间的关系是建模和特征工程的基础。当我们面对高维数据集时,如何快速识别特征间的关联模式?协方差矩阵和皮尔森相关系数矩阵就像…

2026/7/6 12:33:13 阅读更多 →
数据预处理3大核心挑战:特征工程、缺失值与异常值处理的Python解决方案

数据预处理3大核心挑战:特征工程、缺失值与异常值处理的Python解决方案

数据预处理3大核心挑战:特征工程、缺失值与异常值处理的Python解决方案 数据预处理是数据科学项目中最耗时却最关键的环节。当面对真实世界中的脏乱数据集时,如何高效处理缺失值、识别异常点并构建有效特征,直接决定了后续建模的天花板高度。…

2026/7/6 12:31:11 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻