1

我正在查看 java.uti.concurrent.locks.AbstractQueuedSynchronizer 的源代码,acquire() 方法看起来像这样 -

 public final void acquire(int arg) {
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        Thread.currentThread().interrupt();
}

为什么它会中断调用acquire()的线程?如果在线程 run() 方法中的某处进行了检查,那么它可能会在调用 acquire() 之后通过,这可能是不可取的和没有想到的?

有人想弄清楚为什么上面的代码会这样做吗?

4

1 回答 1

4

如果您阅读 Javadoc acquiredQueued,您会注意到如果线程在等待时被中断,它会返回 true。因此,调用selfInterrupt(就像在 OpenJDK 源代码中调用的那样)是将中断传播到调用线程,否则会被吞没。

于 2008-10-16T09:44:34.197 回答