【发布时间】:2021-12-27 16:00:44
【问题描述】:
当一个节点在排队等待锁时,另一个线程中断了他,他会旋转一次然后取消中断并重新挂起自己,就像它从未中断过一样。
按照我的理解,他应该取消锁获取,但现在看来不是这样。当他之前的节点释放锁时,他仍然会像从未中断过一样抢锁,谁能告诉我为什么? 版本是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();
}
【问题讨论】:
-
嗨,欢迎来到 stackoverflow。您能否重新表述您的问题,可能会提供更多上下文信息?我无法理解您到底在问什么。
-
感谢您的回答。我的问题是,当Thread从block中被唤醒时,使用thread.interrupted()清除中断状态,如果没有获得锁,则Thread再次挂起。按照我的理解应该进入cancelAcquire方法,但是我没有找到入口,你能明白我的意思吗?对不起,我的英语不太好
标签: java java-8 interrupt java.util.concurrent