首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java队列向后遍历

问为什么Java队列向后遍历
EN

Stack Overflow用户
提问于 2019-11-12 13:30:09
回答 1查看 45关注 0票数 0

下面是道格·利亚论文中的参考资料:

是一个AbstractQueuedSynchronizer队列节点,它包含到后续节点的下一个链接。但是,由于不存在使用compareAndSet对双链接列表节点进行无锁原子插入的适用技术,因此该链接不是作为插入的一部分进行原子设置的;它只是简单地分配: pred.next = node;插入之后。这反映在所有的用法中。下一个链接只作为优化的路径处理。如果节点的后续节点似乎不存在(或似乎通过其下一个字段被取消),则始终可以从列表的尾部开始,然后使用pred字段向后遍历,以准确地检查是否确实存在。

以下是Java 8的源代码:

代码语言:javascript
复制
    private Node enq(final Node node) {
        for (;;) {
            Node t = tail;
            if (t == null) { // Must initialize
                if (compareAndSetHead(new Node()))
                    tail = head;
            } else {
                node.prev = t;
                if (compareAndSetTail(t, node)) {
                    t.next = node;
                    return t;
                }
            }
        }
    }

如果我把它改为:

代码语言:javascript
复制
else {
    if (compareAndSetTail(t, node)) {
        t.next = node;
        node.pre = t;
        return t;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-11-23 03:47:26

在这种情况下,当线程进入If语句并被其他线程中断时,head节点会从尾节点遍历,甚至无法访问尾节点的prev。

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

https://stackoverflow.com/questions/58819804

复制
相关文章

相似问题

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