AQS如何处理中断



当一个节点排队等待锁时,另一个线程会打断他,他会旋转一次,然后取消中断并重新挂起自己,就像它从未被中断过一样。

根据我的理解,他应该取消获取锁,但现在似乎不是这样。当他之前的节点释放锁时,他仍然会像从未中断过一样抓住锁,谁能告诉我为什么?版本为JDK8

final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
} finally {
if (failed)
cancelAcquire(node);
}
}

private final boolean parkAndCheckInterrupt() {
LockSupport.park(this);
return Thread.interrupted();
}

在您的代码中,线程只能以一种方式离开无限的for(;;)循环——在它满足if(p == head && tryAcquire(arg))的条件之后——因为它是唯一的return语句,所以您也没有任何中断。

然而,你说";如果"未获得锁定";,这意味着线程必须继续执行这个for循环中的内容,这意味着执行第二个if(再次挂起线程(。

当你有一个构造

try {
// some code
}finally{
// finally execution
}

finally块中的代码只有在执行离开try块之后才会执行(正常或由于异常(。

该方法不支持中断,您可以查看doAcquireInterruptibly

最新更新