AQS公平锁的流程

发布时间 2023-09-03 16:43:20作者: 傲云萧雨

reentrantd的lock执行的是aqs的acquire方法

1 tryAcquire

cas设置state的状态从0设置为1,成功则获取到锁,不成功则进行下一步

 2、addWaiter

 没有或取到锁,构建一个node,因为第一次队列没有元素,头部和尾部节点为空,走enq方法会将head和tail都指向一个new Node(),然后将tail指向等待的node节点

后面先当tail不等于null,会尝试cass设置当前node节点为尾部节点,失败也会进入enq方法将节点添加到尾部节点去

 

 3.1首先判断当前节点是不是head的next节点,如果是的话,说明该节点是排在第一位的,会tryAcquire获取锁并且将head指向当前节点

 3.2、当排在第一位的节点获取tryAcquire失败后,则进入是否park休眠判断,当前面一个节点是大于0为1取消状态时候,则

需要do while找到最近的一个节点,并将取消的节点剔除,默认节点是状态是0,然后cas设置为-1(SIGNAL),则可以安心进入

休眠了

 3.3 线程休眠

 

 

解锁过程

1、首先tryRelease,重入锁需要减为0才会返回true,从而准备释放锁

 2、waitStatus信号如果没有变成-1,还是默认状态0,说明队列没有需要唤醒的节点,开始执行unpark方法,因为head节点要么是new出来的无意义的节点,要么是

cas获取到锁的新加入的节点,所以从head的next开始唤醒,如果next节点是被取消了,则从后往前开始唤醒。