首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AQS如何处理中断

AQS如何处理中断
EN

Stack Overflow用户
提问于 2021-11-16 15:00:47
回答 1查看 53关注 0票数 0

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

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

代码语言:javascript
复制
    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();
    }
EN

回答 1

Stack Overflow用户

发布于 2021-11-16 16:00:58

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

但是,您说“没有获得锁”,这意味着线程必须继续执行这个for循环中的内容,这意味着执行第二个if (再次挂起线程)。

当你有一个结构的时候

代码语言:javascript
复制
try {
  // some code
}finally{
 // finally execution
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69991458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档