当一个节点排队等待锁定时,另一个线程会中断他,他会旋转一次,然后取消中断并重新挂起自己,就像从未中断过一样。
根据我的理解,他应该取消锁获取,但现在似乎不是这样。当他之前的节点释放锁时,他仍然会抢占锁,就像它从未被中断过一样,谁能告诉我为什么?版本为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();
}发布于 2021-11-16 16:00:58
在您的代码中,线程只能以一种方式离开那个无限的for(;;)循环--在它满足来自if(p == head && tryAcquire(arg))的条件之后--因为它是惟一的return语句,所以您也没有任何中断。
但是,您说“没有获得锁”,这意味着线程必须继续执行这个for循环中的内容,这意味着执行第二个if (再次挂起线程)。
当你有一个结构的时候
try {
// some code
}finally{
// finally execution
}只有在执行离开try块之后,finally块中的代码才会执行(正常或由于异常)。
https://stackoverflow.com/questions/69991458
复制相似问题