AQS(AbstractQueuedSynchronizer)深度解析:Java并发锁的基石与灵魂
AQSAbstractQueuedSynchronizer深度解析Java并发锁的基石与灵魂一、 什么是AQS——并发包的基石1.1 官方定义1.2 为什么需要AQS1.3 AQS的核心三要素二、 流程图AQS获取与释放资源完整流程三、 AQS三大核心组件3.1 同步状态state资源的核心标识3.2 CLH队列等待线程的管理器3.3 模板方法模式你定规则我管排队四、 独占模式 vs 共享模式4.1 独占模式Exclusive4.2 共享模式Shared五、 实战用AQS实现一个自定义锁六、 避坑指南七、 总结The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇本文导读本文将深入剖析AQSAbstractQueuedSynchronizer的核心原理、设计思想和实现机制从state状态管理到CLH队列从独占模式到共享模式帮助你彻底理解这个Java并发包的灵魂。全文包含四大核心章节、3个彩色流程图、5个代码示例。预计阅读时间25分钟。一、 什么是AQS——并发包的基石1.1 官方定义AbstractQueuedSynchronizer简称AQS是Java并发包java.util.concurrent.locks中的一个抽象类也是整个JUCJava并发工具包同步组件的基石和灵魂。从java.util.concurrent包的源码可以看到ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock、CyclicBarrier等并发工具类的底层实现都直接或间接依赖于AQS。用一句话概括AQS是构建锁和同步器的框架framework for building locks and synchronizers。1.2 为什么需要AQS在AQS出现之前如果要实现一个自定义锁或同步器开发者需要直面复杂的线程排队、阻塞、唤醒等底层操作。这些操作不仅容易出错而且难以优化。AQS的设计目标提供一个模板化的通用框架让开发者只需专注于实现同步状态的获取与释放逻辑即什么是同步条件而将复杂的线程排队、等待、唤醒等机制即如何管理排队线程交给AQS底层统一实现。用Doug Lea的设计哲学来说“你定规则我管排队”。1.3 AQS的核心三要素AQS核心组件 同步状态state CLH等待队列 模板方法模式volatile int state表示资源状态FIFO双向队列管理等待线程独占/共享两种模式二、 流程图AQS获取与释放资源完整流程是否否是是否是 线程请求资源 调用acquire模板方法 tryAcquire尝试获取获取成功?✅ 获得锁, 继续执行 addWaiter创建Node加入队列尾部 acquireQueued自旋尝试获取前驱是头节点?⏳ 线程阻塞parktryAcquire成功? 设置为头节点脱离队列 被前驱唤醒unpark 释放资源 调用release模板方法 tryRelease释放释放成功? 唤醒头节点后继 后继线程解除阻塞三、 AQS三大核心组件3.1 同步状态state资源的核心标识AQS使用一个被volatile修饰的int类型成员变量state来表示同步状态这是所有操作的核心。// AQS中的核心状态变量privatevolatileintstate;// 三个原子操作方法protectedfinalintgetState(){returnstate;}protectedfinalvoidsetState(intnewState){statenewState;}protectedfinalbooleancompareAndSetState(intexpect,intupdate){returnunsafe.compareAndSwapInt(this,stateOffset,expect,update);}state的语义由子类定义同步器state的含义ReentrantLock0表示未被占用0表示重入次数Semaphore剩余许可证数量CountDownLatch还需要倒计数的数量⚠️为什么state需要用volatile修饰因为getState()和setState()不走CAS为了保证可见性必须用volatile。3.2 CLH队列等待线程的管理器当线程获取资源失败时AQS会将其包装成一个Node节点加入一个FIFO先进先出的双向队列中等待。Node节点的核心属性staticfinalclassNode{// 等待状态volatileintwaitStatus;// 前驱和后继指针volatileNodeprev;volatileNodenext;// 该节点代表的线程volatileThreadthread;// 下一个条件等待节点NodenextWaiter;// waitStatus的四种状态staticfinalintCANCELLED1;// 线程已取消staticfinalintSIGNAL-1;// 需要唤醒后继节点staticfinalintCONDITION-2;// 在条件队列中等待staticfinalintPROPAGATE-3;// 共享模式传播}入队操作通过CAS自旋保证线程安全地将节点加入队尾。出队操作当前驱节点释放锁后唤醒后继节点后继节点获取锁成功后将自己设置为新的头节点。3.3 模板方法模式你定规则我管排队AQS使用经典的模板方法设计模式Template Method Pattern。需要子类实现的方法方法说明tryAcquire(int arg)尝试独占式获取资源tryRelease(int arg)尝试独占式释放资源tryAcquireShared(int arg)尝试共享式获取资源tryReleaseShared(int arg)尝试共享式释放资源isHeldExclusively()判断当前线程是否独占持有资源AQS已经实现好的模板方法// AQS的acquire模板方法publicfinalvoidacquire(intarg){// 先尝试获取失败则加入队列并阻塞if(!tryAcquire(arg)acquireQueued(addWaiter(Node.EXCLUSIVE),arg))selfInterrupt();}// AQS的release模板方法publicfinalbooleanrelease(intarg){if(tryRelease(arg)){Nodehhead;if(h!nullh.waitStatus!0)unparkSuccessor(h);// 唤醒后继节点returntrue;}returnfalse;}设计精髓AQS把是否允许获取/释放资源留给子类实现把获取失败后的排队、阻塞、唤醒统一封装好。四、 独占模式 vs 共享模式4.1 独占模式Exclusive特点同一时刻只有一个线程能成功获取资源如ReentrantLock。获取流程调用acquire(int arg)执行子类实现的tryAcquire(arg)尝试获取失败则addWaiter(Node.EXCLUSIVE)创建独占节点入队acquireQueued自旋尝试失败则park阻塞释放流程调用release(int arg)执行子类实现的tryRelease(arg)释放资源成功则唤醒头节点的后继节点4.2 共享模式Shared特点多个线程可同时获取资源如Semaphore、CountDownLatch。核心区别tryAcquireShared返回负数表示失败0表示成功但无剩余正数表示成功且有剩余释放时会级联传播唤醒多个后继节点五、 实战用AQS实现一个自定义锁理解了原理来动手实现一个简单的不可重入互斥锁// 自定义互斥锁不可重入publicclassMuteximplementsLock{privatefinalSyncsyncnewSync();privatestaticclassSyncextendsAbstractQueuedSynchronizer{OverrideprotectedbooleantryAcquire(intarg){// 尝试将state从0改为1if(compareAndSetState(0,1)){setExclusiveOwnerThread(Thread.currentThread());returntrue;}returnfalse;}OverrideprotectedbooleantryRelease(intarg){if(getState()0)thrownewIllegalMonitorStateException();setExclusiveOwnerThread(null);setState(0);returntrue;}OverrideprotectedbooleanisHeldExclusively(){returngetState()1;}}Overridepublicvoidlock(){sync.acquire(1);}Overridepublicvoidunlock(){sync.release(1);}// 其他Lock接口方法代理给sync...}核心体会我们只实现了tryAcquire和tryRelease定义怎样算获取/释放锁而线程排队、阻塞、唤醒等所有复杂机制都由AQS自动完成。六、 避坑指南序号要点说明①state操作复合操作增减用CAS单纯设置用setState②模板方法不可重写acquire/release是final修饰的模板方法不应覆盖③注意中断响应acquireInterruptibly支持可中断获取④公平/非公平公平锁需在tryAcquire中检查hasQueuedPredecessors七、 总结AQS是Java并发包的灵魂与基石它通过三个核心组件——state状态、CLH等待队列和模板方法模式——优雅地解决了同步器构建中的两大核心问题“如何管理排队线程”和“如何定义资源获取条件”。一句话总结AQS state资源状态 CLH队列线程排队 模板方法你定规则我管排队。The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆

相关新闻

Claude Opus 4.6深度实测:专业场景下的认知协作者转型指南

Claude Opus 4.6深度实测:专业场景下的认知协作者转型指南

1. 项目概述:这不是又一个“跑分帖”,而是把Claude Opus 4.6当工具用的真实记录我从去年开始系统性地把Anthropic的Claude系列模型嵌入到日常内容生产、技术文档梳理和跨领域知识整合的工作流里。从Sonnet到Haiku,再到前几代Opus,…

2026/6/19 22:42:14阅读更多 →
17种创意主题:用代码绘制你的城市艺术名片

17种创意主题:用代码绘制你的城市艺术名片

17种创意主题:用代码绘制你的城市艺术名片 【免费下载链接】maptoposter Transform your favorite cities into beautiful, minimalist designs. MapToPoster lets you create and export visually striking map posters with code. 项目地址: https://gitcode.co…

2026/6/19 22:42:14阅读更多 →
【解构】GE-GAN:图嵌入与生成对抗网络如何重塑城市交通感知

【解构】GE-GAN:图嵌入与生成对抗网络如何重塑城市交通感知

1. GE-GAN:当城市交通遇上深度学习 堵车时盯着前方看不到尽头的车流,你有没有想过——如果交通系统能像人脑一样"思考",实时感知整个路网的状态,会不会让出行更顺畅?这正是GE-GAN技术正在实现的革命。这个结…

2026/6/19 22:42:14阅读更多 →
ieBetter.js高级技巧:如何扩展自定义API到旧版IE浏览器

ieBetter.js高级技巧:如何扩展自定义API到旧版IE浏览器

ieBetter.js高级技巧:如何扩展自定义API到旧版IE浏览器 【免费下载链接】ieBetter.js make ie browser like a morden browser main for ie6~ie8, 项目地址: https://gitcode.com/gh_mirrors/ie/ieBetter.js ieBetter.js是一款专为IE6~IE8设计的浏览器增强工…

2026/6/19 23:52:39阅读更多 →
PCSX2模拟器性能优化方法论:3大架构瓶颈与5层调优策略深度解析

PCSX2模拟器性能优化方法论:3大架构瓶颈与5层调优策略深度解析

PCSX2模拟器性能优化方法论:3大架构瓶颈与5层调优策略深度解析 【免费下载链接】pcsx2 PCSX2 - The Playstation 2 Emulator 项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 PCSX2作为PlayStation 2硬件架构的软件仿真器,在现代计算机平…

2026/6/19 23:52:39阅读更多 →
DeepSeek Coder深度解析:让AI代码生成提升你的开发效率300%

DeepSeek Coder深度解析:让AI代码生成提升你的开发效率300%

DeepSeek Coder深度解析:让AI代码生成提升你的开发效率300% 【免费下载链接】DeepSeek-Coder DeepSeek Coder: Let the Code Write Itself 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder 你是否曾经在深夜调试代码时,渴望有一…

2026/6/19 23:52:39阅读更多 →
WebView控制完全掌握:JSBrowser中前进/后退/刷新功能的实现方法

WebView控制完全掌握:JSBrowser中前进/后退/刷新功能的实现方法

WebView控制完全掌握:JSBrowser中前进/后退/刷新功能的实现方法 【免费下载链接】JSBrowser :evergreen_tree: A web browser built with JavaScript as a Windows app 项目地址: https://gitcode.com/gh_mirrors/js/JSBrowser JSBrowser是一款使用JavaScrip…

2026/6/19 23:52:39阅读更多 →
Circuit在微服务架构中的应用:真实案例分析和经验分享

Circuit在微服务架构中的应用:真实案例分析和经验分享

Circuit在微服务架构中的应用:真实案例分析和经验分享 【免费下载链接】circuit An efficient and feature complete Hystrix like Go implementation of the circuit breaker pattern. 项目地址: https://gitcode.com/gh_mirrors/circ/circuit 在微服务架构…

2026/6/19 23:52:39阅读更多 →
信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器

信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器

信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器 【免费下载链接】trust-zh-CN 一个合作博弈论的互动讲解手册 An interactive guide to the game theory of cooperation 项目地址: https://gitcode.com/gh_mirrors/tr/trust-zh-CN GitHub 加速…

2026/6/19 23:47:39阅读更多 →
Photobucket付费墙背后:5美元买童年回忆却落得一场空!

Photobucket付费墙背后:5美元买童年回忆却落得一场空!

1. 付费墙初现如今身处万亿市值公司林立的时代,我们也不能轻易放弃5美元。就像Photobucket,它曾相当于过去的Imgur,我们小时候常把图片上传到这个网站,然后在各种论坛上分享链接,它简单好用,尽职尽责。但最…

2026/6/19 0:04:37阅读更多 →
如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南

如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南

如何在5分钟内掌握Mermaid Live Editor:实时图表编辑终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live…

2026/6/19 0:04:37阅读更多 →
yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南

yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南

yuzu模拟器内存修改技术深度解析:金手指功能实现原理与实践指南 【免费下载链接】yuzu 项目地址: https://gitcode.com/GitHub_Trending/yuz/yuzu yuzu作为目前最流行的开源Nintendo Switch模拟器,不仅提供了完整的游戏运行环境,还内…

2026/6/19 0:04:37阅读更多 →