代码块的展示
- isHeldExclusively()这个仅持有锁资源的方法,在ReentrantLock中重写进行判断,要是没有持有锁资源那么会返回false,就会出现直接抛异常IllegalMonitorStateException(非法监视器状态异常)
- 获取排在ConditionObject中单向队列首位的节点线程
- 最后便是执行doSignal(first)这个方法
doSignal(first)方法分析
- 通过do while循环实现先执行再判断
- 获取当前第一个节点的下一个节点,并将该节点置为第一个节点。要是该节点为null,尾巴节点也为null,便于脱离Condition队列说明队列中空空了。
- 执行判断,要是前一个条件为true,则直接退出循环。否则再判断后续是否还有节点,有的话则会继续唤醒
transferForSignal(first)方法的分析
- 该方法时唤醒再Condition中排队的线程
- 通过CAS的方式将状态值由原先的-2修改为0,表示线程被唤醒,要是修改失败则返回false,就会回到上面这个图中执行后续的(first = firstWaiter) != null)判断
- 要是CAS设置成功(改为0),则会将当前节点放到AQS队列并返回上一个节点 Node p = enq(node);
- 获取上一个节点的状态,要是大于0或者(存在优先级,前面的先)后续CAS设置取消失败就挂起该线程,要是判断中第一个条件命中,说明线程已经被取消,赶紧唤醒当前线程。要是第一个判断条件没有命中,第二个CAS失败了,依然要唤醒当前线程。