diff --git a/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java b/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java index 10f2b6540cde3cda1602b55220aef3558984a638..dc946786f8367c39473f6f1c36c08dac0c8d1293 100644 --- a/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java +++ b/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java @@ -766,19 +766,21 @@ public class LinkedBlockingQueue extends AbstractQueue } /** - * 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 nextNode(Node p) { - Node 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 s = p.next; + if (s == p) + return head.next; + if (s == null || s.item != null) + return s; + p = s; + } } public E next() {