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节点是被取消了,则从后往前开始唤醒。
标签:node,head,AQS,cas,流程,next,tail,公平,节点 From: https://www.cnblogs.com/wenwenzuiniucha/p/17675160.html