hymn

忽有故人心头过,回首山河已是秋。

  menu
132 文章
0 浏览
2 当前访客
ღゝ◡╹)ノ❤️

AQS

AbstractQueuedSynchronizer抽象同步队列简称AQS,它是实现同步器的基础组件,并发包中锁的底层就是使用AQS实现的


AQS是一个FIFO的双向队列,其内部通过节点 headtail记录队首和队尾元素,队列元素的类型为 Node

其中 Node中thread变量用来存放进入AQS队列里面的线程;

Node节点内部的 SHARED用来标记该线程是获取共享资源时被阻塞挂起后放入AQS队列的,

EXCLUSIVE用来标记线程是获取独占资源时被挂起后放入AQS队列的;

waitStatus记录当前线程等待状态,可以为 CANCELLED(线程被取消了)、SIGNAL(线程需要被唤醒)、CONDITION(线程在条件队列里面等待)、PROPAGATE(释放共享资源时需要通知其他节点);

prev记录当前节点的前驱节点,next记录当前节点的后继节点。


在AQS中维持了一个单一的状态信息 state,可以通过 getStatesetStatecompareAndSetState函数修改其值。

对于 ReentrantLock的实现来说,state可以用来表示当前线程获取锁的可重入次数;

对于读写锁 ReentrantReadWriteLock来说,state的高16位表示读状态,也就是获取该读锁的次数,低16位表示获取到写锁的线程的可重入次数;

对于 semaphore来说,state用来表示当前可用信号的个数;

对于 CountDownlatch来说,state用来表示计数器当前的值。


标题:AQS
作者:hymn
地址:https://dxyhymn.com/articles/2020/12/23/1608695899718.html