Node
thread变量用来存放进入AQS队列里面的线程
SHARED用来标记该线程是获取共享资源时被阻塞挂起后放入AQS队列的
EXCLUSIVE用来标记线程是获取独占资源时被挂起后放入AQS队列的
waitStatus记录当前线程等待状态,可以为CANCELLED(线程被取消了)、SIGNAL(线程需要被唤醒)、CONDITION(线程在条件队列里面等待)、PROPAGATE(释放共享资源时需要通知其他节点)
prev记录当前节点的前驱节点
next记录当前节点的后继节点
state
以通过getState、setState、compareAndSetState函数修改其值
对于ReentrantLock的实现来说,state可以用来表示当前线程获取锁的可重入次数
对于读写锁ReentrantReadWriteLock来说,state的高16位表示读状态,也就是获取该读锁的次数,低16位表示获取到写锁的线程的可重入次数
对于semaphore来说,state用来表示当前可用信号的个数
对于CountDownlatch来说,state用来表示计数器当前的值
内部类ConditionObject
可以直接访问AQS对象内部的变量
是个条件变量,每个条件变量对应一个条件队列(单向链表队列),其用来存放调用条件变量的await方法后被阻塞的线程
在每个条件变量内部都维护了一个条件队列,用来存放调用条件变量的await()方法时被阻塞的线程。注意这个条件队列和AQS队列不是一回事
另外一个线程调用条件变量的signal()或者signalAll()方法时,会把条件队列里面的一个或者全部Node节点移动到AQS的阻塞队列里面,等待时机获取锁