xmlns="http://www.w3.org/2000/svg"style="display:并发包中,很多重量级组件都依赖一个共同的底层框架——AQS。可以说:不懂AQS,就很难真正理解ReentrantLock、Semaphore、CountDownLatch等工具的实现原理。本文将从设计思想、核心结构、源码流程和实战应用等方面介绍/>文章目录一、什么是AQSAQS?二、为什么需要状态变量(State)2.CLH获取锁流程(以独占锁为例)1.获取锁流程2.核心源码流程(简化版)六、AQS释放锁流程七、共享锁模式共享模式特点八、实战:手写一个简易锁九、AQS的优缺点优点缺点十、面试高频问题1.AQS公平锁如何实现?参考/>的定义AQS(AbstractQueuedSynchronizer,抽象队列同步器),是JDK提供的一个用于构建锁和同步器的基础框架。本质上:AQS=线程调度。很多并发工具,都是在AQS的组件包括:ReentrantLockSemaphoreCountDownLatchReentrantReadWriteLockFutureTask它们底层都复用了AQS出现之前,每个锁都要自己处理:线程阻塞队列管理唤醒机制问题:重复造轮子易出Bug难维护AQS的目标:把“排队+唤醒”统一封装。开发者只需关注:如何获取和释放资源。/>三、AQS状态变量(State)AQS内部维护一个volatilestate:privatevolatileintstate;含义由子类决定:ReentrantLock:锁重入次数Semaphore:剩余许可数CountDownLatch:计数器/>2.双向队列,用于存放等待线程。特点:先进先出公平性保障基于CLH变种实现结构示意:Head<->state:compareAndSetState(old,new)保证修改原子性。/>四、AQSNode:主要字段:thread:线程引用prevnext:队列指针waitStatus:状态标识常见状态:状态值含义0默认SIGNAL等待唤醒CANCELLED已取消/>2.内部维护:volatileNodehead;volatileNodetail;组成双向链表。/>五、AQS获取锁流程(以独占锁为例)以ReentrantLock/>详细步骤:CAS尝试修改state成功则获得锁失败则进入等待队列挂起线程(park)被唤醒后再次竞争/>2.核心源码流程(简化版)if(!tryAcquire(arg)){addWaiter();acquireQueued();}体现:先抢锁,抢不到再排队。/>六、AQS释放锁流程释放流程:tryReleasestatestate时释放成功唤醒队头节点unpark后继线程示意:释放竞争支持两种模式:模式说明示例独占同一时刻一个线程ReentrantLock共享多线程同时访问Semaphore共享模式特点多个线程可同时获取通过state/>八、实战:手写一个简易锁基于AQS实现自定义锁:classMyLockextendsAbstractQueuedSynchronizer{@OverrideprotectedbooleantryAcquire(intarg){returncompareAndSetState(0,1);}@OverrideprotectedbooleantryRelease(intarg){setState(0);returntrue;}}使用:MyLocklock=newMyLock();lock.acquire(1);try{//业务逻辑}finally{lock.release(1);}/>九、AQS的优缺点优点高度复用结构清晰扩展性强性能优秀缺点学习成本高源码复杂调试困难AQS核心组成?答:state+如何保证线程安全?答:CAS+公平锁如何实现?答:先判断队列是否有前驱节点。/>参考AQS详解bilibili.com