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