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

回到顶部