一、AQS中的队列
ReentrantLock锁的实现依赖于AQS,而AQS内部实现锁是依赖于
volatile int state 状态
跟volatile Node head,volatile Node tail链表,
模型大致如下

status:记录当前锁是否被占用,lock的次数,例如0代表未被占用,2代表lock了2次
exclusiveOwnerThread:记录了当前占用锁的线程
head:等待队列的头结点,该节点并不是真正的线程等待节点,算是一个控制节点,CLH锁的核心部分
tail:等待队列的尾节点
二、队列及状态变化
*为了更好的展示,将head、tail的变化与status、exclusiveOwnerThread分开了*
1.thread1首次lock,head、tail为null无变化
head = null
tail = null
2.thread1未unlock,thread2调用lock
锁状态无变化
因为没有申请下锁,thread2需要添加到队列
3.thread1未unlock,thread3调用lock
锁状态无变化
因为没有申请下锁,thread3需要添加到队列
4.thread1调用unlock
锁状态变化如下
队列变化
5.thread2被unpark
锁状态变化如下
队列变化
到此,一个完整的lock & unlock的sync状态以及队列变化已经完成。
三、其他说明
1.锁状态从0到1使用的CAS锁
2.等待线程节点放入队列尾部也是CAS锁+自旋
3.首次添加队列时,会new一个head节点(初始化队列),该节点设置也是通过CAS锁
4.每次增加节点到tail,都会修改prev节点状态为-1,意为prev节点需要唤醒他的next节点线程(CLH队列锁)