
前言在Java并发编程中,AbstractQueuedSynchronizer(简称AQS)是 Doug Lea 大师为我们提供的一套基于队列的同步框架。几乎所有Java并发工具类,如ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock等,都是基于AQS实现的。理解AQS的原理,对于深入掌握Java并发编程至关重要。今天,我们就来彻底搞懂AQS的工作原理。一、AQS是什么?AQS是Java并发包(JUC)的核心组件,定义了一套通用的等待线程管理机制。1.1 核心数据结构AQS内部维护了一个FIFO双向同步队列:publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizer{// 同步队列的头节点privatetransientvolatileNodehead;// 同步队列的尾节点privatetransientvolatileNodetail;// 同步状态(锁的计数)privatevolatileintstate;}1.2 Node节点结构staticfinalclassNode{// 标记节点正在共享模式等待staticfinalNodeSHARED=newNode();// 标记节点正在独占模式等待staticfinalNodeEXCLUSIVE=null;// 节点状态:取消staticfinalintCANCELLED=1;// 节点状态:需要被唤醒staticfinalintSIGNAL=-1;// 节点状态:等待条件staticfinalintCONDITION=-2;// 节点状态:传播staticfinalintPROPAGATE=-3;volatileintwaitStatus;// 节点等待状态volatileNodeprev;// 前驱节点volatileNodenext;// 后继节点volatileThreadthread;// 封装的线程NodenextWaiter;// 条件队列链接}二、独占模式与共享模式AQS支持两种同步模式:2.1 独占模式(Exclusive)同一时刻,只有一个线程能够获取锁。代表实现:ReentrantLock// 独占模式获取锁publicfinalvoidacquire(intarg){if(!tryAcquire(arg)acquireQueued(addWaiter(Node.EXCLUSIVE),arg))selfInterrupt();}// 独占模式释放锁publicfinalbooleanrelease(intarg){if(tryRelease(arg)){Nodeh=head;if(h!=null