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

java中ReentrantLock使用公平锁相关问题

在 AQS 的锁里应该用 Condition.await() / signal() 那么,这里使用了Condition.await()的线程,挂到哪里去?CLH 队列尾部吗?

好问题 👌,你已经把 AQS 的同步队列 (CLH queue)Condition 机制 联系起来了。这里要特别小心理解,因为 Condition.await() 的线程不是直接挂到 CLH 同步队列里,而是挂在 Condition 的等待队列 (Condition Queue)


1️⃣ AQS 中有两种队列

  • 同步队列 (Sync Queue / CLH 队列)

    • 存放那些 因为抢不到锁而阻塞的线程
    • AQS 的核心:LockSupport.park/unpark 挂起和唤醒都靠它。
  • 条件队列 (Condition Queue)

    • 每个 Condition 对象独立维护的一个单向链表队列。
    • 存放那些调用了 Condition.await() 的线程。
    • 它们不是立即去抢锁,而是等 signal() 把它们“转移”到同步队列后,才有机会竞争锁。

2️⃣ Condition.await() 的执行过程

当线程 已经持有锁,调用 await() 时会发生:

  1. 释放锁(这点跟 Object.wait() 类似)

    • state 归零,锁完全释放。
    • 方便其它线程拿到锁。
  2. 加入 Condition 队列

    • 当前线程被封装为一个 Node,加入 Condition Queue
  3. 挂起线程

    • 调用 LockSupport.park() 进入阻塞状态。

👉 此时线程不在同步队列,而在 Condition Queue


3️⃣ Condition.signal() 的执行过程

当别的线程调用 signal()

  1. Condition Queue 头部取出一个 Node(等待线程)。

  2. 把它从 Condition Queue 转移到 CLH 同步队列

    • 转移动作是 AQS 内部的核心逻辑:transferForSignal()
  3. 被转移的线程依然阻塞着,直到它在同步队列里排到队首,被唤醒后重新竞争锁。


4️⃣ ✅ 总结

  • Condition.await() 的线程 不会立即进入 CLH 队列,而是进入 Condition Queue

  • 只有在 signal()signalAll() 时,才会被转移到 CLH 队列,等待重新竞争锁。

  • 因此:

    • CLH 队列 = 锁竞争阻塞队列
    • Condition 队列 = 等待条件的线程队列
  • 最终线程一定会回到 CLH 队列,因为想继续执行必须重新抢锁。

http://www.dtcms.com/a/341993.html

相关文章:

  • 河南萌新联赛2025第(六)场:郑州大学补题
  • 分享一个基于Python与spark大数据的护肤品市场用户行为分析与可视化平台,基于hadoop的护肤品使用行为追踪与分析可视化平台的设计与实现
  • uniapp vue3 ts自定义底部 tabbar菜单
  • FPGA DP1.4 With DSC解决方案
  • IE启动时主页被360守护了想变回去怎么办?
  • Spring Boot + Spring AI 最小可运行 Demo
  • TensorFlow深度学习实战(33)——深度确定性策略梯度
  • 【知识储备】PyTorch / TensorFlow 和张量的联系
  • 29、工业网络威胁检测与响应 (IDS 模拟) - /安全与维护组件/industrial-network-ids
  • C# OpencvSharp获取Astra Pro奥比中光深度相机深度图
  • AXI GPIO S——ZYNQ学习笔记10
  • 基于OpenCV的物体识别与计数
  • 基于SpringBoot的流浪动物领养管理系统【2026最新】
  • 【Android】悬浮窗清理
  • 政务分建用户体系下基于OAuth2.0概念单点登录实现方案
  • CT02-20.有效的括号(Java)
  • 【Linux | 网络】多路转接IO之select
  • Linux软件编程--网络操作
  • FreeRTOS,事件标注组创建,xEventGroupCreate、xEventGroupCreateStatic
  • 【自记】Power BI 中 CALCULATETABLE 第二个及后续参数支持的两种类型说明
  • 基于混合注意力网络和深度信念网络的鲁棒视频水印技术基础理论深度解析
  • 【世纪龙科技】汽车专业虚拟仿真实训基地建设-理实虚一体化实践
  • 【lucene】lucene常用查询一览
  • 一键去除 Windows 图标角标(小箭头、盾牌与双箭头)
  • JeeSite V5.13.0 发布,升级 Spring Boot 3.5,Cloud 2025,AI 1.0,Vite 7
  • ORACLE中如何批量重置序列
  • 如何保证数据库和缓存的一致性?
  • 强化学习中的重要性采样:跨分布复用样本的核心技术
  • 大模型0基础开发入门与实践:第8章 “大力出奇迹”的哲学:大语言模型的核心技术揭秘
  • 【世纪龙科技】汽车专业虚拟仿真实训基地建设方案