Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaAQS队列向后遍历_Java_Concurrency - Fatal编程技术网

为什么JavaAQS队列向后遍历

为什么JavaAQS队列向后遍历,java,concurrency,Java,Concurrency,以下是Doug Lea论文中的参考: AbstractQueuedSynchronizer队列节点包含指向其 继承人但是因为没有适用的技术 使用 与数据集相比,此链接不是作为插入的一部分自动设置的; 它被简单地分配:pred.next=节点;插入之后。这是 反映在所有用法中。下一个链接仅被视为优化链接 路径如果节点的后续节点似乎不存在(或似乎不存在) 取消)通过其下一个字段,始终可以在 列表的尾部,并使用pred字段向后遍历 准确地检查是否真的有 以下是Java 8源代码: privat

以下是Doug Lea论文中的参考:

AbstractQueuedSynchronizer队列节点包含指向其 继承人但是因为没有适用的技术 使用 与数据集相比,此链接不是作为插入的一部分自动设置的; 它被简单地分配:pred.next=节点;插入之后。这是 反映在所有用法中。下一个链接仅被视为优化链接 路径如果节点的后续节点似乎不存在(或似乎不存在) 取消)通过其下一个字段,始终可以在 列表的尾部,并使用pred字段向后遍历 准确地检查是否真的有

以下是Java 8源代码:

    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;
                }
            }
        }
    }
如果我将其更改为:

else {
    if (compareAndSetTail(t, node)) {
        t.next = node;
        node.pre = t;
        return t;
    }
}

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