当前位置: 首页 > news >正文

详细介绍:ReentrantLock 加锁与解锁流程详解(源码分析,小白易懂)

在这里插入图片描述

‍程序员三明治:个人主页

个人专栏: 《设计模式精解》《重学数据结构》

先做到 再看见!

ReentrantLock加锁流程

加锁成功流程

其实就是把state改为1,然后设置ExclusiveOwnerThread为当前线程** 加锁失败流程**

  1. 进入tryAcquire逻辑,这是state已经是1,结果仍然失败
  2. 接下来进入addWaiter逻辑,构造Node队列
    • 下图中黄色三角表示该Node的waitStatus状态,其中0为默认正常状态
    • Node的创建是懒惰的
    • 其中第一个Node成为Dummy,用来占位,并不关联线程


当前线程进入acquireQueued的逻辑

  1. acquireQueued会在第一个死循环中不断尝试获得锁,失败后进入park阻塞
  2. 如果自己紧邻着head(排第二位),那么再次tryAcquire尝试获取锁,当然这时state仍为1,失败
  3. 进入shouldParkAfterFailedAcquire逻辑,将前驱node,即head的waitStatus改为-1,这次返回false

  1. shouldParkAfterFailedAcquire执行完毕回到acquireQueued(因为是死循环),再次tryAcquire尝试获取锁,当然这时state仍为1,失败
  2. 当再次进入shouldParkAfterFailedAcquire时,这是因为其前驱node的waitStatus已经是-1,这次返回true
  3. 进入parkAndCheckInterrupt,Thread-1 park(灰色表示)

ReentrantLock解锁后是怎么竞争的?

解锁竞争成功

![](https://i-blog.csdnimg.cn/img_convert/4c547a6c8ffabfa86196b1891fd977ea.png)

此时Thread-0释放锁,进入tryRelease流程,如果成功
  • 设置exclusiveOwnerThread为null
  • state=0

  • 当前队列不为null,并且head的waitStatus=-1,进入unparkSuccessor流程
  • 找到队列中离head最近的一个Node(没取消的),unpark恢复其运行,本例中即为Thread-1
  • 回到Thread-1的acquireQueued流程


此时Thread-1的Node在下一次进入循环的时候发现tryAcquire成功了,会设置

- exclusiveOwnerThread为Thread-1,state=1
- head指向刚刚Thread-1所在的Node,该Node清空Thread
- 原本的head因为从链表断开,可以被垃圾回收

解锁竞争失败
如果这时候有其他线程来竞争(非公平的体现),例如这时有Thread-4来了


如果不巧又被Thread-4抢先

- Thread-4被设置为exclusiveOwnerThread,state=1,
- Thread-1再次进入acquireQueued流程,获取锁失败,重新进入park阻塞

总结

这篇文档主要介绍了Java中ReentrantLock的加锁和解锁流程,包括成功和失败的情况。以下是文档的重点概括:

ReentrantLock加锁流程

加锁成功
  1. 将state设置为1。
  2. 设置ExclusiveOwnerThread为当前线程。
加锁失败
  1. 进入tryAcquire逻辑,如果state已经是1,则失败。
  2. 进入addWaiter逻辑,构造Node队列。
    • Node的创建是懒惰的。
    • 第一个Node成为Dummy,不关联线程。
  3. 当前线程进入acquireQueued逻辑。
    • 在死循环中尝试获取锁,失败则进入park阻塞。
    • 如果自己紧邻着head(排第二位),再次尝试tryAcquire获取锁。
    • 将前驱node(head)的waitStatus设置为-1。
    • 进入parkAndCheckInterrupt,线程park。

ReentrantLock解锁后的竞争

解锁竞争成功
  1. Thread-0释放锁,进入tryRelease流程。
    • 设置exclusiveOwnerThread为null。
    • state设置为0。
    • 如果当前队列不为null,并且head的waitStatus为-1,进入unparkSuccessor流程。
    • 找到队列中离head最近的一个Node(未取消的),unpark恢复其运行(例如Thread-1)。
    • Thread-1的Node在下一次循环时发现tryAcquire成功,设置exclusiveOwnerThread为Thread-1,state为1,head指向Thread-1所在的Node。
解锁竞争失败
  1. 如果有其他线程(如Thread-4)竞争。
    • Thread-4可能抢先设置为exclusiveOwnerThread,state为1。
    • Thread-1再次进入acquireQueued流程,获取锁失败,重新进入park阻塞。

这篇文档详细描述了ReentrantLock在加锁和解锁过程中的内部机制,包括状态的变更、队列的构造、线程的阻塞和唤醒等关键步骤。





如果我的内容对你有帮助,请辛苦动动您的手指为我点赞,评论,收藏。感谢大家!!
在这里插入图片描述

http://www.jsqmd.com/news/345188/

相关文章:

  • 2026年可靠的钢结构球形支座生产商推荐,好用的品牌有哪些 - mypinpai
  • 新能源汽车维修哪家技术强?2026年维修公司排名推荐,直击检测精度与安全痛点 - 品牌推荐
  • 2026年洗发水厂家年度排名大梳理,靠谱品牌选购指南 - myqiye
  • 2026年康复机构展厅迎宾讲解机器人技术深度解析与主流产品选型指南 - 智造出海
  • 2026年沈阳创业人群烘焙培训学校排名,知名品牌性价比大揭秘 - 工业设备
  • 2026年口碑好的个人护理加工工厂排名,哪家技艺高靠谱 - 工业品网
  • 电驴时代联系方式:使用其服务前的注意事项提示 - 品牌推荐
  • 电驴时代 联系方式: 了解其业务板块与行业定位的参考 - 品牌推荐
  • 2026年浙江地区流延机节能的品牌推荐,价格多少 - 工业品牌热点
  • 2026年热门的节能保温材料/墙体保温材料厂家热销推荐 - 行业平台推荐
  • 2026年广西诚信的信息流广告机构推荐,售后完善价格多少 - 工业推荐榜
  • 电驴时代 联系方式:用户联系与通用信息说明 - 品牌推荐
  • 开题报告 springboot和vue 装修材料销售管理系统
  • 探讨洗发水制造商哪家性价比高,别错过这些 - 工业品网
  • 2026年口碑好的压花兔毛绒/兔毛绒热门厂家推荐汇总 - 行业平台推荐
  • 开题报告 springboot和vue- 服装面料采购系统
  • 电驴时代 联系方式:行业合作背景与风险提示简述 - 品牌推荐
  • 电驴时代 联系方式:解析其业务模式与核心竞争优势 - 品牌推荐
  • 2026年热门的懒人抹布毛巾布/毛巾布厂家采购参考指南 - 行业平台推荐
  • 2026广州沐浴露生产商排名,口碑好又靠谱的厂家有哪些 - myqiye
  • 开题报告 springboot和vue-上班就业信息网
  • BioPathNet:基于路径嵌入的医学生物知识图谱链接预测框架
  • 开题基于Twitter的数据影响力分析及可视化
  • 2026年江苏流延机自动化程度高的品牌,口碑好的有哪些 - 工业品牌热点
  • 欧派木门联系方式:官方服务入口与背景信息简介 - 品牌推荐
  • 开题报告 springboot和vue 学生作品发布平台 优秀学生作品分享系统
  • 2026年口碑好的背印牛奶绒/金编牛奶绒高评分品牌推荐(畅销) - 行业平台推荐
  • 用CreateTableOne生成表
  • 第2篇 产品经理在移动互联网时代的角色演变与实践探索
  • 欧派木门联系方式:消费者咨询与沟通方式说明 - 品牌推荐