AQS 是什么?

news/2025/11/10 14:43:22/文章来源:https://www.cnblogs.com/irobotzz/p/19206998

AQS 是什么?

AQS 是什么?

java.util.concurrent.locks.AbstractQueuedSynchronizer,简称 AQS,是 JUC 同步器的底座。像 ReentrantLockSemaphoreCountDownLatchReentrantReadWriteLockStampedLock(部分)等,都是基于 AQS 搭建的。

AQS 做两件事:

  1. 管理一个原子状态位 statevolatile int),用 CAS 修改;

  2. 维护一个CLH 同步队列(双向链表)来排队阻塞/唤醒获取同步状态失败的线程(LockSupport.park/unpark)。

你只需要继承 AQS并覆写少数模板方法(如 tryAcquire/tryRelease 等),排队、阻塞、唤醒、公平/非公平、可中断、超时……AQS 都帮你处理好了。


核心概念一览

  • state:同步状态(通常 0=空闲,>0=已占用/剩余许可数)。

  • 独占模式(exclusive):一次只允许一个线程持有(如 ReentrantLock)。

  • 共享模式(shared):可同时允许多个线程持有(如 SemaphoreCountDownLatch 的“门闩剩余数”)。

  • CLH 队列:失败的获取者入队,头节点负责唤醒后继。

  • 可重入:独占模式下,持有者再次获取会让 state++(如 ReentrantLock)。

  • Condition:基于 AQS 提供的 ConditionObject,实现“在锁内等待/通知”。


获取/释放的大致流程(简化)

以独占为例(acquire):

  1. 调用方先走子类覆写的 tryAcquire(arg)能拿就拿(CAS 改 state,设置独占线程)。

  2. 拿不到则入队(尾插 CLH 队列)、阻塞park)。

  3. 被前驱唤醒后重试获取;成功后设为队头(“哨兵”),以便继续唤醒下一位。

释放(release):

  1. 调子类 tryRelease(arg):把 state 调整(可能到 0)。

  2. 如果完全释放(state==0),就唤醒后继unpark)。

共享模式(acquireShared/releaseShared):

  • tryAcquireShared(arg) 返回剩余许可(>=0 表示成功且可能还有余量继续唤醒别人;<0 表示失败需排队)。

  • releaseShared 成功后会级联唤醒后继,直到余量耗尽或队列空。

可中断与超时:AQS 提供 acquireInterruptiblytryAcquireNanos 等变体,内部处理打断与超时逻辑。


公平 vs 非公平

  • 公平:按队列先来先服务(入队后排在前面的先获取)。如 new ReentrantLock(true)

  • 非公平:允许新来的线程插队(直接先 CAS 一把),吞吐高、抖动大。默认的 ReentrantLock 非公平。


和常见同步器的映射

  • ReentrantLock:独占模式(可重入),state 表示重入次数;tryAcquire 检查持有者/CAS;tryRelease 递减到 0 时释放。

  • Semaphore:共享模式,state 表示剩余许可tryAcquireShared 用 CAS 扣减,>=0 成功。

  • CountDownLatch:共享模式,state计数await 共享获取(计数>0 则排队),countDown 共享释放(到 0 唤醒所有等待者)。

  • ReentrantReadWriteLock:读共享/写独占;state 高低位编码读写计数并发。


Condition 怎么来的?

AbstractQueuedSynchronizer 内置 ConditionObject

  • await():把当前线程从同步队列转移到条件队列并释放锁 → 阻塞等待信号。

  • signal():把条件队列里的节点转回同步队列 → 等待被重新竞争锁。

  • 只有持锁线程才能 await/signal,这保证了条件变量的正确使用时序。


手写一个最小不可重入互斥锁(示例)

import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.TimeUnit;public class SimpleMutex implements Lock {private static class Sync extends AbstractQueuedSynchronizer {// state: 0=free, 1=held@Overrideprotected boolean tryAcquire(int acquires) {// 不可重入:当前没有人持有时才允许 CAS 抢占if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());return true;}return false;}@Overrideprotected boolean tryRelease(int releases) {if (getState() == 0 || getExclusiveOwnerThread() != Thread.currentThread())throw new IllegalMonitorStateException();setExclusiveOwnerThread(null);setState(0);return true; // 唤醒后继}@Overrideprotected boolean isHeldExclusively() {return getState() == 1 && getExclusiveOwnerThread() == Thread.currentThread();}}private final Sync sync = new Sync();@Override public void lock()                   { sync.acquire(1); }@Override public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); }@Override public boolean tryLock()             { return sync.tryAcquire(1); }@Override public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireNanos(1, unit.toNanos(time));}@Override public void unlock()                 { sync.release(1); }@Override public java.util.concurrent.locks.Condition newCondition() {return sync.newConditionObject();}
}

说明:我们只覆写了 tryAcquire/tryRelease/isHeldExclusively,其余的排队/阻塞/唤醒/中断/超时全部由 AQS 兜底。


设计细节与性能点

  • 阻塞策略:失败后不会疯狂自旋,AQS 在合适节点调用 park(),被前驱或释放唤醒后再竞争,兼顾性能与公平。

  • 虚假唤醒:按经典并发模式,使用者应在 while 循环里检查条件(AQS 的 Condition 实现已遵循该约定)。

  • 可重入:自行在 tryAcquire 中检查“当前线程是否持有”,是则 state++;释放时 state-- 到 0 才真正释放。

  • 中断/超时:AQS 已提供对应 API 的模板逻辑,覆写只管状态语义。


何时自己写一个 AQS 同步器?

  • 你需要自定义并发语义(比如“只允许 N 个并发 + 每个线程最多重入 M 次”这类组合规则);

  • 现有的 Lock/Semaphore 无法直接覆盖你的场景;

  • 你希望享受“成熟的排队/阻塞/唤醒/中断/超时/条件队列”但只关心状态判定

只要明确:状态怎么表示(state)何时算获取成功/释放成功(tryAcquire/tryRelease),剩下交给 AQS。


常见易错点

  • 忘记设置/清除独占线程:独占模式下需要 setExclusiveOwnerThread/null

  • tryRelease 返回值错:返回 true 才会唤醒后继;如果还有重入没释放干净要返回 false

  • 共享模式返回值语义tryAcquireShared 返回 ≥0 表示成功(且可能仍有剩余许可),<0 表示失败

  • Condition 必须在持锁时 await/signal:否则会 IllegalMonitorStateException

  • 自定义同步器的可见性statevolatile,但对其他共享字段的发布要遵循 JMM(在成功获取/释放的路径做好可见性保障)。


速记卡(面试 10 秒版)

AQS = CAS 管状态 + CLH 队列管等待
覆写 tryAcquire/tryRelease(独占)或 tryAcquireShared/tryReleaseShared(共享)就能做出自己的同步器。
ReentrantLock/Semaphore/CountDownLatch/RWLock 都是它的“皮肤”。
Condition 由 ConditionObject 提供,await/signal 依赖持锁语义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/961401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年军训服定制厂家权威推荐榜单:幼儿园服/迷彩服/校服源头厂家精选

专业化的军训服装,已成为保障训练安全和提升团队风貌的重要装备。 据教育装备行业协会数据显示,中国在校高中生及高校新生年军训人数超过1500万,军训服市场年需求量稳步增长。与此同时,企业对员工军训的重视也推动…

神级项目,Github 上线封神,BettaFish你不可忽视的多Agent舆情分析神器~~~

嗨,我是小华同学,专注解锁高效工作与前沿AI工具!每日精选开源技术、实战技巧,助你省时50%、领先他人一步。👉免费订阅,与10万+技术人共享升级秘籍!“微舆” 是一个从0实现的创新型多智能体舆情分析系统,帮助大…

2025年湖南工商注册公司权威推荐榜单:工商注册流程变更/记账报税服务/代理记账财务源头机构精选

为企业提供专业、高效、安心的工商注册服务,已成为推动区域经济发展的重要支撑。 据湖南省市场监督管理局数据显示,2024年全省新登记各类经营主体超过80万户,同比增长约12%,工商注册服务需求持续旺盛。 本文基于对…

完整教程:每日一个网络知识点:网络层ARP和RARP

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

MyEMS:赋能能源精细化管理的智慧引擎

在“双碳”目标引领与能源转型加速的当下,企业与组织对能源管理的精细化、智能化需求日益迫切。传统能源管理模式下,数据采集滞后、分析维度单一、节能潜力难挖掘等痛点,严重制约了能源利用效率的提升。而MyEMS(My…

nginx详细配置

1、location语法 1、功能和请求用来匹配不同的url请求,从而对这些请求做出不同的处理和响应网站的请求URL和location配置的URL做匹配总路径 = root指定的根目录 + location 指定的路径2、匹配规则 1、=(精确匹配)loca…

2025年新型建筑木方源头厂家综合实力榜单:建筑施工模板/覆膜建筑模板/清水覆膜板生产厂家精选

新型建筑木方作为现代建筑施工中不可或缺的支撑材料,其市场需求与品质要求同步提升。行业数据显示,建筑木方在模板支撑系统中的成本占比约为15%-20%,其抗压性能与周转率直接影响工程成本与进度。本文基于对企业生产…

我开源了一款基于unicloud + uniapp 开发的云端一体小程序:停车寻车助手 - 安雁

停车寻车助手面向个人的停车寻车助手,基于uniCloud + vue3的全栈项目。支持驻车记录、寻车导航、收藏点管理、车辆信息管理等小程序扫码预览技术栈- vite - vue3 - ts - uniCloud - wotDesignUni - unocss部署 -…

污点和容忍度

污点(Taint)和容忍度(Toleration)的机制是,当节点被标记了污点,只有那些容忍这些污点的Pod才可以被调度到该节点(对于已经运行的Pod,则可能被驱逐)。 污点有三个效果(effect):NoSchedule:不会调度新的Pod…

开源能源管理系统:解锁当下能源困局的关键力量

在全球能源结构转型与 “双碳” 目标深化的双重背景下,能源管理已从企业内部成本控制问题升级为关乎生态安全与产业竞争力的核心议题。传统商业能源管理系统因高昂成本、封闭架构与适配性不足等痛点,难以满足不同规模…

2025年负极石墨粉超微碎机定制厂家权威推荐榜单:负极材料磨粉机/脱硫脱硝小苏打粉碎机/钴酸锂气流粉碎机源头厂家精选

在新能源产业高速发展的背景下,负极石墨粉作为锂电池的核心材料,其粉碎精度与粒度分布直接影响电池的能量密度与循环寿命。超微粉碎技术通过将石墨材料加工至微米乃至纳米级别,能够显著提升负极材料的比表面积与电化…

天气和预报

在万物易源中查找天气并且找到密钥,然后打开jemter,添加名称,步骤如图所示,点击保存并且运行,然后添加查看结果树,运行成功则如上图所示; 查找快递步骤与天气类似

2025年11月适合小学生的学习机品牌评测榜:十强性能口碑全面对比

孩子刚上小学,家长最怕“学得快忘得更快”:课堂45分钟坐不住,回家作业拖成马拉松,家长一吼就哭,一放手就玩。学习机成了“救命稻草”,可市面产品动辄两三千元,功能写得天花乱坠,真买回家却可能屏幕刺眼、内容超…

对GitHub的了解和使用

在去年的时候我建立了自己的GitHub账号,但是从未真正用过,最近正好想起,像试试其效果如何,结果出乎我的意料。 我也知道了为什么这么多人都选择使用GitHub: 版本控制:完整记录每次代码变更,便于回溯和协作 协作…

详细介绍:五点法求解相机的相对位姿

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Gitee:打造本土化技术生态,驱动中国数字化变革新引擎

Gitee:打造本土化技术生态,驱动中国数字化变革新引擎 在数字经济成为全球竞争新高地的今天,中国软件产业正经历从"跟随"到"引领"的历史性跨越。作为这一进程的关键基础设施,Gitee通过深度本土…

2025年11月学习机品牌推荐:权威排行揭示清北双师与AI精准学差异

“孩子放学回家,作业辅导谁来管?”这句看似轻松的调侃,却精准戳中无数家庭的痛点。2025年秋季学期,全国义务教育阶段新课标全面落地,教材同步难度、探究任务、跨学科融合要求同步抬升,家长辅导压力陡增;叠加“双…

2025年卫生应急服生产厂家综合实力榜单:卫生应急藏青无领T恤/黑色立领外套/纯棉黑T恤源头厂家精选

卫生应急服作为保障公共卫生安全与应对突发事件的核心装备,其市场需求呈现持续增长态势。行业数据显示,近年来,中国医用防护服市场规模年增长率保持在8%以上,产品质量与功能创新成为行业焦点。本文基于对企业生产能…

2025年11月学习机品牌推荐:家长口碑榜对比十强同步教材与护眼方案

2025年11月,期中刚过,家长群里的焦虑值再次拉满:新课标题型更新、期中暴露的薄弱点还没补上,期末又被提上日程。一台能把“清北老师+AI诊断+同步教材”同时装进书包的学习机,成了不少家庭“补救+预习”双重场景下…

python: 一些ModuleNotFoundError报错的解决

一,alibabacloud_ocr_api20210707 报错: ModuleNotFoundError: No module named alibabacloud_ocr_api20210707 解决: $ pip install alibabacloud_ocr_api20210707二,app_store_notifications_v2_validator 报错:…