news 2026/4/16 13:34:37

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/4/11 15:30:12

1999-2024年 上市公司-微观企业劳动力生产率数据(数据+代码+文献)

一、数据简介 微观企业劳动生产率(Labor Productivity at the Firm Level)体现单位劳动投入创造的产出价值,是衡量企业将劳动力要素转化为经济产出效率的关键指标。1999-2024年上市公司-微观企业劳动力生产率数据(数据代码文献&am…

作者头像 李华
网站建设 2026/4/16 12:33:57

我用AI一天开发一个App,2026年是“全民开发”元年?

文章目录前言先破防:以前写App有多难,现在就有多简单核心:2026年主流AI开发工具,小白闭眼选1. 扣子Coze(字节跳动官方,无代码首选)2. Dify(开源免费,AI功能强&#xff09…

作者头像 李华
网站建设 2026/4/15 18:20:10

【期货量化策略】期货量化交易策略均值回归(Python量化)

一、前言 均值回归策略基于价格会回归均值的假设,在价格偏离均值时进行反向交易。本文将介绍各种均值回归策略的实现方法。 本文将介绍: 均值回归基本原理布林带策略RSI策略价差回归策略统计套利 二、为什么选择天勤量化(TqSdk&#xff0…

作者头像 李华