AQS是锁的底层支持。

抽象同步队列AQS概述_可重入

AQS是一个FIFO的双向队列,队列元素类型为Node(也就是Thread)。AQS有一个state属性,ReentrantLock可以用来便是当前线程获取锁的可重入次数;对于samaphore来说,state表示当前可用信号的个数;对于CountDownLatch,state表示计数器当前的值。

AQS的内部类ConditionObject,它是条件变量,每个条件变量对应一个条件队列(单向链表),用来存放await方法后被阻塞的线程。

对于AQS来说,线程同步的关键是对状态值state操作。操作state的方式有独占和共享。使用独占方式获取的资源与线程绑定,一个线程获取了资源,会标记这个线程获取到了,其他线程想获取,发现获取资源的不是自己,就会陷入阻塞状态。

共享方式的资源与具体线程是不相关的,比如Semaphore信号量,当一个线程通过acquire获取信号量时,会看信号量个数是否满足,不满足就把线程放入阻塞队列,如果满足通过CAS获取信号量。