news 2026/4/6 22:55:14

HoRain云--揭秘AQS:ReentrantLock高效锁机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--揭秘AQS:ReentrantLock高效锁机制

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

🔧 加锁流程详解

🔄 解锁与传递

⚖️ 关键机制与设计思想

💡 总结与实践


AbstractQueuedSynchronizer(AQS)是Java并发包中构建锁和同步器的核心框架。理解它最好的方式,就是通过一个具体的锁实现来看其运作机制。下面这个表格清晰地展示了ReentrantLock与AQS的协作关系,帮你快速抓住核心。

组件/角色

ReentrantLock中的体现

核心职责

AQS (AbstractQueuedSynchronizer)

内部类Sync继承自 AQS

提供同步状态管理线程阻塞队列(CLH变体)​ 和线程阻塞/唤醒的底层框架。

State (同步状态)

AQS 中的volatile int state字段

ReentrantLock而言,state=0表示锁空闲;state>0表示锁被占用,且数值代表锁的重入次数

独占模式 (Exclusive)

ReentrantLock是独占锁

同一时间只能有一个线程获取锁。

尝试获取/释放锁 (TryAcquire/Release)

Sync的子类 (NonfairSync,FairSync) 实现

定义公平/非公平策略下,如何具体地获取和释放锁。

线程排队队列 (CLH Queue)

AQS 内部维护的 FIFO 双向链表(head,tail

存放获取锁失败的线程,形成一个等待队列,确保锁分配的公平性。

🔧 加锁流程详解

当你调用lock.lock()时,其内部流程清晰地展示了AQS如何运作。

  1. 首次争抢(非公平锁为例)

    线程A首先会直接尝试利用CAS操作将state从0改为1。如果成功,表示它立刻抢到了锁,并将独占线程设置为自身。这种“插队”行为是非公平锁的典型特征,旨在减少线程切换的开销,提升性能。

  2. 争抢失败,进入队列

    如果线程A已持有锁,此时线程B来争抢,CAS操作会失败。随后会调用AQS的acquire(1)方法。这个方法是一个模板方法,其核心逻辑是:

  3. 处理可重入

    如果线程A已经持有锁,再次调用lock(),这就是可重入。此时,tryAcquire会检查当前线程是否是独占线程,如果是,则将state简单地加1。因此,state的值就代表了该线程重入锁的次数。

🔄 解锁与传递

解锁过程(lock.unlock())则相对直接,展示了锁如何安全地在线程间传递。

  1. 释放锁

    线程A调用unlock(),会触发tryRelease方法。该方法会将state减1。只有当state被减为0时,才表示锁被完全释放(即重入次数已清零)。

  2. 唤醒后继

    如果锁被完全释放,AQS会找到等待队列的头节点(它是一个空节点或已取消的节点),然后唤醒其后的第一个有效等待节点(即线程B)。

  3. 后继线程获取锁

    线程B被唤醒后,会从之前acquireQueued中的阻塞点继续执行,再次尝试tryAcquire。此时锁已被释放,线程B成功获取锁,并将自己设置为新的头节点,从而出队。

⚖️ 关键机制与设计思想

💡 总结与实践

AQS通过一个状态(state)​ 和一个FIFO队列,构建了一个强大且灵活的同步器框架。ReentrantLock只是其一个经典应用。基于AQS,你还可以实现信号量(Semaphore)、栅栏(CountDownLatch)等复杂的同步工具。

简单来说,AQS就像是一个高度定制化的“排队管理器”:它定义好了排队的规则、休息区的管理以及何时叫下一个号的流程,而具体的“服务窗口”(如ReentrantLock)则只需决定什么样的顾客(线程)可以被立刻服务(获取锁)。

希望这个结合ReentrantLock的解析能帮助你透彻地理解AQS的工作原理!如果你对AQS的共享模式(如Semaphore)或Condition条件队列感兴趣,我们可以继续深入探讨。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 22:44:03

基于车速的变预测时域的MPC自适应轨迹跟踪控制,能够预测时域的, 类似驾驶员模型中的预瞄距离...

基于车速的变预测时域的MPC自适应轨迹跟踪控制,能够预测时域的, 类似驾驶员模型中的预瞄距离,在不同的车速下,预瞄控制器采用不同预瞄距离产生的控制效果不同,通过carsim与simulink联合仿真结果发现,改进后的轨迹跟踪控…

作者头像 李华
网站建设 2026/4/3 5:28:22

基于python的海鱼类科普网站的 海洋生物知识科普系统

目录系统概述核心功能模块技术实现要点部署与维护开发技术路线结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统概述 一个基于Python的海鱼类科普网站旨在通过交互式平台向公众普及海洋生物知识,整合图文、视频、数据库…

作者头像 李华
网站建设 2026/4/4 21:46:12

transformer(下)

接下来是decoderdecoder其实有两种,接下来介绍的是autoregressive的decoder以语音辨识为例子,机器收到一段声音讯号作为输入到encoder,此时输出就是一排vector,接下来就是decoder的运作,产生语音辨识的结果首先先给他一…

作者头像 李华
网站建设 2026/4/3 6:39:28

【期货量化策略】期货量化交易策略趋势跟踪(Python量化)

一、前言 趋势跟踪是量化交易中最经典的策略类型。通过识别和跟踪市场趋势,可以在趋势行情中获得稳定收益。本文将介绍各种趋势跟踪策略的实现方法。 本文将介绍: 趋势跟踪基本原理移动平均策略突破策略动量策略趋势确认方法 二、为什么选择天勤量化…

作者头像 李华