ReentrantLock源码之中断
大家好,
我跟踪lock.lockInterruptibly()方法时,对这个方法的实现有疑问
finally { if (failed)
cancelAcquire(node);
}
当head -> pre -> current -> next时,代码来到这里
else { unparkSuccessor(node);
}
我觉得应该把pre和next连接就行了,但是unparkSuccessor方法并没有这样做。是不是遗漏了这个case ? 本来是current中断,为什么需要unpark(next) ?
回答:
关注这么几天,一个参与讨论的都没有-_-
。
其实你说的pre和next连接是做了的。
比如这段,就在cancelAcquire中。
// If we are the tail, remove ourselves.
if (node == tail && compareAndSetTail(node, pred)) {
compareAndSetNext(pred, predNext, null);
} else {
// If successor needs signal, try to set pred's next-link
// so it will get one. Otherwise wake it up to propagate.
int ws;
if (pred != head &&
((ws = pred.waitStatus) == Node.SIGNAL ||
(ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) &&
pred.thread != null) {
Node next = node.next;
if (next != null && next.waitStatus <= 0)
compareAndSetNext(pred, predNext, next);
} else {
unparkSuccessor(node);
}
node.next = node; // help GC
}
如果是tail,直接就把pred设置为tail,如果设置成功,直接把next设置为null。
下面的大概意思是,如果上节点不是头,同时处于信号阶段,或者可以转为信号阶段,并且有可执行线程。也是把pred的next设置为node.next(),这个操作是做了的。
以上是 ReentrantLock源码之中断 的全部内容, 来源链接: utcz.com/p/944146.html