下面是道格·利亚论文中的参考资料:
是一个AbstractQueuedSynchronizer队列节点,它包含到后续节点的下一个链接。但是,由于不存在使用compareAndSet对双链接列表节点进行无锁原子插入的适用技术,因此该链接不是作为插入的一部分进行原子设置的;它只是简单地分配: pred.next = node;插入之后。这反映在所有的用法中。下一个链接只作为优化的路径处理。如果节点的后续节点似乎不存在(或似乎通过其下一个字段被取消),则始终可以从列表的尾部开始,然后使用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;
}
}发布于 2019-11-23 03:47:26
在这种情况下,当线程进入If语句并被其他线程中断时,head节点会从尾节点遍历,甚至无法访问尾节点的prev。
https://stackoverflow.com/questions/58819804
复制相似问题