首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在独占模式下,AbstractQueuedSynchronizer在何处更改其头引用

在独占模式下,AbstractQueuedSynchronizer在何处更改其头引用
EN

Stack Overflow用户
提问于 2019-04-17 14:12:29
回答 1查看 66关注 0票数 0

我正在研究AbstractQueuedSynchronizer类的源代码,当我阅读acquireQueued方法的代码时:

代码语言: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);
        }
    }

语句final Node p = node.predecessor();表示获取当前节点的上一个节点p。下一个if语句尝试比较p节点和head节点。

我的疑问是如何更改head节点以便代码可以进入if语句,以及更改发生在哪个代码块中

似乎在shouldParkAfterFailedAcquire/parkAndCheckInterrupt/release/unparkSuccessor方法中找不到代码块

EN

回答 1

Stack Overflow用户

发布于 2019-11-21 11:03:21

  1. 显然,当第二个节点被唤醒并且tryAcquire成功时,它将成为头节点。然后,当第三个节点被唤醒时,头节点changes.
  2. Entering setHead(node); if语句并不一定意味着头已经改变。如果该节点的前一个节点被取消,则该节点可以充当头节点的后节点。请参见shouldParkAfterFailedAcquire method

中的详细信息

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

https://stackoverflow.com/questions/55721000

复制
相关文章

相似问题

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