ReentrantLock源码之中断

大纲007
  • 170

大家好,
我跟踪lock.lockInterruptibly()方法时,对这个方法的实现有疑问

finally {
            if (failed)
                cancelAcquire(node);
}

当head -> pre -> current -> next时,代码来到这里

else {
                unparkSuccessor(node);
}

我觉得应该把pre和next连接就行了,但是unparkSuccessor方法并没有这样做。是不是遗漏了这个case ? 本来是current中断,为什么需要unpark(next) ?

回复
阅读 520
1 个回答

关注这么几天,一个参与讨论的都没有-_-
其实你说的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(),这个操作是做了的。

宣传栏