6871697: LinkedBlockingQueue Iterator/remove/poll race

More checks for node.next == node

Reviewed-by: martin, dholmes, chegar
This commit is contained in:
Doug Lea 2009-08-25 19:19:42 -07:00
parent 50754f7c2e
commit f1047d3739

View File

@ -766,19 +766,21 @@ public class LinkedBlockingQueue<E> extends AbstractQueue<E>
}
/**
* Unlike other traversal methods, iterators need to handle:
* Returns the next live successor of p, or null if no such.
*
* Unlike other traversal methods, iterators need to handle both:
* - dequeued nodes (p.next == p)
* - interior removed nodes (p.item == null)
* - (possibly multiple) interior removed nodes (p.item == null)
*/
private Node<E> nextNode(Node<E> p) {
Node<E> s = p.next;
if (p == s)
return head.next;
// Skip over removed nodes.
// May be necessary if multiple interior Nodes are removed.
while (s != null && s.item == null)
s = s.next;
return s;
for (;;) {
Node<E> s = p.next;
if (s == p)
return head.next;
if (s == null || s.item != null)
return s;
p = s;
}
}
public E next() {