AQS-节点的起始状态0是怎么来的,为什么要有0这个状态?
之所以初始化为0而不是-1,是为了在release()方法里去区分是否需要唤醒后继节点:
-
if (h != null && h.waitStatus != 0)
-
unparkSuccessor(h);
当前线程释放资源之后,去唤醒后继节点时,判断条件是!=0的,也就是说,对于一个没有后继节点的节点(状态为0就说明没有后继节点,因为如果有后继节点的话,前驱节点的状态就会被设置为-1)来说,是不需要去唤醒后继节点的
之所以初始化为0而不是-1,是为了在release()方法里去区分是否需要唤醒后继节点:
当前线程释放资源之后,去唤醒后继节点时,判断条件是!=0的,也就是说,对于一个没有后继节点的节点(状态为0就说明没有后继节点,因为如果有后继节点的话,前驱节点的状态就会被设置为-1)来说,是不需要去唤醒后继节点的