1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation.  Oracle designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25/*
26 * This file is available under and governed by the GNU General Public
27 * License version 2 only, as published by the Free Software Foundation.
28 * However, the following notice accompanied the original version of this
29 * file:
30 *
31 * Written by Doug Lea and Martin Buchholz with assistance from members of
32 * JCP JSR-166 Expert Group and released to the public domain, as explained
33 * at http://creativecommons.org/publicdomain/zero/1.0/
34 */
35
36package java.util.concurrent;
37
38import java.lang.invoke.MethodHandles;
39import java.lang.invoke.VarHandle;
40import java.util.AbstractCollection;
41import java.util.Arrays;
42import java.util.Collection;
43import java.util.Deque;
44import java.util.Iterator;
45import java.util.NoSuchElementException;
46import java.util.Objects;
47import java.util.Queue;
48import java.util.Spliterator;
49import java.util.Spliterators;
50import java.util.function.Consumer;
51import java.util.function.Predicate;
52
53/**
54 * An unbounded concurrent {@linkplain Deque deque} based on linked nodes.
55 * Concurrent insertion, removal, and access operations execute safely
56 * across multiple threads.
57 * A {@code ConcurrentLinkedDeque} is an appropriate choice when
58 * many threads will share access to a common collection.
59 * Like most other concurrent collection implementations, this class
60 * does not permit the use of {@code null} elements.
61 *
62 * <p>Iterators and spliterators are
63 * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
64 *
65 * <p>Beware that, unlike in most collections, the {@code size} method
66 * is <em>NOT</em> a constant-time operation. Because of the
67 * asynchronous nature of these deques, determining the current number
68 * of elements requires a traversal of the elements, and so may report
69 * inaccurate results if this collection is modified during traversal.
70 *
71 * <p>Bulk operations that add, remove, or examine multiple elements,
72 * such as {@link #addAll}, {@link #removeIf} or {@link #forEach},
73 * are <em>not</em> guaranteed to be performed atomically.
74 * For example, a {@code forEach} traversal concurrent with an {@code
75 * addAll} operation might observe only some of the added elements.
76 *
77 * <p>This class and its iterator implement all of the <em>optional</em>
78 * methods of the {@link Deque} and {@link Iterator} interfaces.
79 *
80 * <p>Memory consistency effects: As with other concurrent collections,
81 * actions in a thread prior to placing an object into a
82 * {@code ConcurrentLinkedDeque}
83 * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a>
84 * actions subsequent to the access or removal of that element from
85 * the {@code ConcurrentLinkedDeque} in another thread.
86 *
87 * <p>This class is a member of the
88 * <a href="{@docRoot}/java/util/package-summary.html#CollectionsFramework">
89 * Java Collections Framework</a>.
90 *
91 * @since 1.7
92 * @author Doug Lea
93 * @author Martin Buchholz
94 * @param <E> the type of elements held in this deque
95 */
96public class ConcurrentLinkedDeque<E>
97    extends AbstractCollection<E>
98    implements Deque<E>, java.io.Serializable {
99
100    /*
101     * This is an implementation of a concurrent lock-free deque
102     * supporting interior removes but not interior insertions, as
103     * required to support the entire Deque interface.
104     *
105     * We extend the techniques developed for ConcurrentLinkedQueue and
106     * LinkedTransferQueue (see the internal docs for those classes).
107     * Understanding the ConcurrentLinkedQueue implementation is a
108     * prerequisite for understanding the implementation of this class.
109     *
110     * The data structure is a symmetrical doubly-linked "GC-robust"
111     * linked list of nodes.  We minimize the number of volatile writes
112     * using two techniques: advancing multiple hops with a single CAS
113     * and mixing volatile and non-volatile writes of the same memory
114     * locations.
115     *
116     * A node contains the expected E ("item") and links to predecessor
117     * ("prev") and successor ("next") nodes:
118     *
119     * class Node<E> { volatile Node<E> prev, next; volatile E item; }
120     *
121     * A node p is considered "live" if it contains a non-null item
122     * (p.item != null).  When an item is CASed to null, the item is
123     * atomically logically deleted from the collection.
124     *
125     * At any time, there is precisely one "first" node with a null
126     * prev reference that terminates any chain of prev references
127     * starting at a live node.  Similarly there is precisely one
128     * "last" node terminating any chain of next references starting at
129     * a live node.  The "first" and "last" nodes may or may not be live.
130     * The "first" and "last" nodes are always mutually reachable.
131     *
132     * A new element is added atomically by CASing the null prev or
133     * next reference in the first or last node to a fresh node
134     * containing the element.  The element's node atomically becomes
135     * "live" at that point.
136     *
137     * A node is considered "active" if it is a live node, or the
138     * first or last node.  Active nodes cannot be unlinked.
139     *
140     * A "self-link" is a next or prev reference that is the same node:
141     *   p.prev == p  or  p.next == p
142     * Self-links are used in the node unlinking process.  Active nodes
143     * never have self-links.
144     *
145     * A node p is active if and only if:
146     *
147     * p.item != null ||
148     * (p.prev == null && p.next != p) ||
149     * (p.next == null && p.prev != p)
150     *
151     * The deque object has two node references, "head" and "tail".
152     * The head and tail are only approximations to the first and last
153     * nodes of the deque.  The first node can always be found by
154     * following prev pointers from head; likewise for tail.  However,
155     * it is permissible for head and tail to be referring to deleted
156     * nodes that have been unlinked and so may not be reachable from
157     * any live node.
158     *
159     * There are 3 stages of node deletion;
160     * "logical deletion", "unlinking", and "gc-unlinking".
161     *
162     * 1. "logical deletion" by CASing item to null atomically removes
163     * the element from the collection, and makes the containing node
164     * eligible for unlinking.
165     *
166     * 2. "unlinking" makes a deleted node unreachable from active
167     * nodes, and thus eventually reclaimable by GC.  Unlinked nodes
168     * may remain reachable indefinitely from an iterator.
169     *
170     * Physical node unlinking is merely an optimization (albeit a
171     * critical one), and so can be performed at our convenience.  At
172     * any time, the set of live nodes maintained by prev and next
173     * links are identical, that is, the live nodes found via next
174     * links from the first node is equal to the elements found via
175     * prev links from the last node.  However, this is not true for
176     * nodes that have already been logically deleted - such nodes may
177     * be reachable in one direction only.
178     *
179     * 3. "gc-unlinking" takes unlinking further by making active
180     * nodes unreachable from deleted nodes, making it easier for the
181     * GC to reclaim future deleted nodes.  This step makes the data
182     * structure "gc-robust", as first described in detail by Boehm
183     * (http://portal.acm.org/citation.cfm?doid=503272.503282).
184     *
185     * GC-unlinked nodes may remain reachable indefinitely from an
186     * iterator, but unlike unlinked nodes, are never reachable from
187     * head or tail.
188     *
189     * Making the data structure GC-robust will eliminate the risk of
190     * unbounded memory retention with conservative GCs and is likely
191     * to improve performance with generational GCs.
192     *
193     * When a node is dequeued at either end, e.g. via poll(), we would
194     * like to break any references from the node to active nodes.  We
195     * develop further the use of self-links that was very effective in
196     * other concurrent collection classes.  The idea is to replace
197     * prev and next pointers with special values that are interpreted
198     * to mean off-the-list-at-one-end.  These are approximations, but
199     * good enough to preserve the properties we want in our
200     * traversals, e.g. we guarantee that a traversal will never visit
201     * the same element twice, but we don't guarantee whether a
202     * traversal that runs out of elements will be able to see more
203     * elements later after enqueues at that end.  Doing gc-unlinking
204     * safely is particularly tricky, since any node can be in use
205     * indefinitely (for example by an iterator).  We must ensure that
206     * the nodes pointed at by head/tail never get gc-unlinked, since
207     * head/tail are needed to get "back on track" by other nodes that
208     * are gc-unlinked.  gc-unlinking accounts for much of the
209     * implementation complexity.
210     *
211     * Since neither unlinking nor gc-unlinking are necessary for
212     * correctness, there are many implementation choices regarding
213     * frequency (eagerness) of these operations.  Since volatile
214     * reads are likely to be much cheaper than CASes, saving CASes by
215     * unlinking multiple adjacent nodes at a time may be a win.
216     * gc-unlinking can be performed rarely and still be effective,
217     * since it is most important that long chains of deleted nodes
218     * are occasionally broken.
219     *
220     * The actual representation we use is that p.next == p means to
221     * goto the first node (which in turn is reached by following prev
222     * pointers from head), and p.next == null && p.prev == p means
223     * that the iteration is at an end and that p is a (static final)
224     * dummy node, NEXT_TERMINATOR, and not the last active node.
225     * Finishing the iteration when encountering such a TERMINATOR is
226     * good enough for read-only traversals, so such traversals can use
227     * p.next == null as the termination condition.  When we need to
228     * find the last (active) node, for enqueueing a new node, we need
229     * to check whether we have reached a TERMINATOR node; if so,
230     * restart traversal from tail.
231     *
232     * The implementation is completely directionally symmetrical,
233     * except that most public methods that iterate through the list
234     * follow next pointers ("forward" direction).
235     *
236     * We believe (without full proof) that all single-element deque
237     * operations (e.g., addFirst, peekLast, pollLast) are linearizable
238     * (see Herlihy and Shavit's book).  However, some combinations of
239     * operations are known not to be linearizable.  In particular,
240     * when an addFirst(A) is racing with pollFirst() removing B, it is
241     * possible for an observer iterating over the elements to observe
242     * A B C and subsequently observe A C, even though no interior
243     * removes are ever performed.  Nevertheless, iterators behave
244     * reasonably, providing the "weakly consistent" guarantees.
245     *
246     * Empirically, microbenchmarks suggest that this class adds about
247     * 40% overhead relative to ConcurrentLinkedQueue, which feels as
248     * good as we can hope for.
249     */
250
251    private static final long serialVersionUID = 876323262645176354L;
252
253    /**
254     * A node from which the first node on list (that is, the unique node p
255     * with p.prev == null && p.next != p) can be reached in O(1) time.
256     * Invariants:
257     * - the first node is always O(1) reachable from head via prev links
258     * - all live nodes are reachable from the first node via succ()
259     * - head != null
260     * - (tmp = head).next != tmp || tmp != head
261     * - head is never gc-unlinked (but may be unlinked)
262     * Non-invariants:
263     * - head.item may or may not be null
264     * - head may not be reachable from the first or last node, or from tail
265     */
266    private transient volatile Node<E> head;
267
268    /**
269     * A node from which the last node on list (that is, the unique node p
270     * with p.next == null && p.prev != p) can be reached in O(1) time.
271     * Invariants:
272     * - the last node is always O(1) reachable from tail via next links
273     * - all live nodes are reachable from the last node via pred()
274     * - tail != null
275     * - tail is never gc-unlinked (but may be unlinked)
276     * Non-invariants:
277     * - tail.item may or may not be null
278     * - tail may not be reachable from the first or last node, or from head
279     */
280    private transient volatile Node<E> tail;
281
282    private static final Node<Object> PREV_TERMINATOR, NEXT_TERMINATOR;
283
284    @SuppressWarnings("unchecked")
285    Node<E> prevTerminator() {
286        return (Node<E>) PREV_TERMINATOR;
287    }
288
289    @SuppressWarnings("unchecked")
290    Node<E> nextTerminator() {
291        return (Node<E>) NEXT_TERMINATOR;
292    }
293
294    static final class Node<E> {
295        volatile Node<E> prev;
296        volatile E item;
297        volatile Node<E> next;
298    }
299
300    /**
301     * Returns a new node holding item.  Uses relaxed write because item
302     * can only be seen after piggy-backing publication via CAS.
303     */
304    static <E> Node<E> newNode(E item) {
305        Node<E> node = new Node<E>();
306        ITEM.set(node, item);
307        return node;
308    }
309
310    /**
311     * Links e as first element.
312     */
313    private void linkFirst(E e) {
314        final Node<E> newNode = newNode(Objects.requireNonNull(e));
315
316        restartFromHead:
317        for (;;)
318            for (Node<E> h = head, p = h, q;;) {
319                if ((q = p.prev) != null &&
320                    (q = (p = q).prev) != null)
321                    // Check for head updates every other hop.
322                    // If p == q, we are sure to follow head instead.
323                    p = (h != (h = head)) ? h : q;
324                else if (p.next == p) // PREV_TERMINATOR
325                    continue restartFromHead;
326                else {
327                    // p is first node
328                    NEXT.set(newNode, p); // CAS piggyback
329                    if (PREV.compareAndSet(p, null, newNode)) {
330                        // Successful CAS is the linearization point
331                        // for e to become an element of this deque,
332                        // and for newNode to become "live".
333                        if (p != h) // hop two nodes at a time; failure is OK
334                            HEAD.weakCompareAndSet(this, h, newNode);
335                        return;
336                    }
337                    // Lost CAS race to another thread; re-read prev
338                }
339            }
340    }
341
342    /**
343     * Links e as last element.
344     */
345    private void linkLast(E e) {
346        final Node<E> newNode = newNode(Objects.requireNonNull(e));
347
348        restartFromTail:
349        for (;;)
350            for (Node<E> t = tail, p = t, q;;) {
351                if ((q = p.next) != null &&
352                    (q = (p = q).next) != null)
353                    // Check for tail updates every other hop.
354                    // If p == q, we are sure to follow tail instead.
355                    p = (t != (t = tail)) ? t : q;
356                else if (p.prev == p) // NEXT_TERMINATOR
357                    continue restartFromTail;
358                else {
359                    // p is last node
360                    PREV.set(newNode, p); // CAS piggyback
361                    if (NEXT.compareAndSet(p, null, newNode)) {
362                        // Successful CAS is the linearization point
363                        // for e to become an element of this deque,
364                        // and for newNode to become "live".
365                        if (p != t) // hop two nodes at a time; failure is OK
366                            TAIL.weakCompareAndSet(this, t, newNode);
367                        return;
368                    }
369                    // Lost CAS race to another thread; re-read next
370                }
371            }
372    }
373
374    private static final int HOPS = 2;
375
376    /**
377     * Unlinks non-null node x.
378     */
379    void unlink(Node<E> x) {
380        // assert x != null;
381        // assert x.item == null;
382        // assert x != PREV_TERMINATOR;
383        // assert x != NEXT_TERMINATOR;
384
385        final Node<E> prev = x.prev;
386        final Node<E> next = x.next;
387        if (prev == null) {
388            unlinkFirst(x, next);
389        } else if (next == null) {
390            unlinkLast(x, prev);
391        } else {
392            // Unlink interior node.
393            //
394            // This is the common case, since a series of polls at the
395            // same end will be "interior" removes, except perhaps for
396            // the first one, since end nodes cannot be unlinked.
397            //
398            // At any time, all active nodes are mutually reachable by
399            // following a sequence of either next or prev pointers.
400            //
401            // Our strategy is to find the unique active predecessor
402            // and successor of x.  Try to fix up their links so that
403            // they point to each other, leaving x unreachable from
404            // active nodes.  If successful, and if x has no live
405            // predecessor/successor, we additionally try to gc-unlink,
406            // leaving active nodes unreachable from x, by rechecking
407            // that the status of predecessor and successor are
408            // unchanged and ensuring that x is not reachable from
409            // tail/head, before setting x's prev/next links to their
410            // logical approximate replacements, self/TERMINATOR.
411            Node<E> activePred, activeSucc;
412            boolean isFirst, isLast;
413            int hops = 1;
414
415            // Find active predecessor
416            for (Node<E> p = prev; ; ++hops) {
417                if (p.item != null) {
418                    activePred = p;
419                    isFirst = false;
420                    break;
421                }
422                Node<E> q = p.prev;
423                if (q == null) {
424                    if (p.next == p)
425                        return;
426                    activePred = p;
427                    isFirst = true;
428                    break;
429                }
430                else if (p == q)
431                    return;
432                else
433                    p = q;
434            }
435
436            // Find active successor
437            for (Node<E> p = next; ; ++hops) {
438                if (p.item != null) {
439                    activeSucc = p;
440                    isLast = false;
441                    break;
442                }
443                Node<E> q = p.next;
444                if (q == null) {
445                    if (p.prev == p)
446                        return;
447                    activeSucc = p;
448                    isLast = true;
449                    break;
450                }
451                else if (p == q)
452                    return;
453                else
454                    p = q;
455            }
456
457            // TODO: better HOP heuristics
458            if (hops < HOPS
459                // always squeeze out interior deleted nodes
460                && (isFirst | isLast))
461                return;
462
463            // Squeeze out deleted nodes between activePred and
464            // activeSucc, including x.
465            skipDeletedSuccessors(activePred);
466            skipDeletedPredecessors(activeSucc);
467
468            // Try to gc-unlink, if possible
469            if ((isFirst | isLast) &&
470
471                // Recheck expected state of predecessor and successor
472                (activePred.next == activeSucc) &&
473                (activeSucc.prev == activePred) &&
474                (isFirst ? activePred.prev == null : activePred.item != null) &&
475                (isLast  ? activeSucc.next == null : activeSucc.item != null)) {
476
477                updateHead(); // Ensure x is not reachable from head
478                updateTail(); // Ensure x is not reachable from tail
479
480                // Finally, actually gc-unlink
481                PREV.setRelease(x, isFirst ? prevTerminator() : x);
482                NEXT.setRelease(x, isLast  ? nextTerminator() : x);
483            }
484        }
485    }
486
487    /**
488     * Unlinks non-null first node.
489     */
490    private void unlinkFirst(Node<E> first, Node<E> next) {
491        // assert first != null;
492        // assert next != null;
493        // assert first.item == null;
494        for (Node<E> o = null, p = next, q;;) {
495            if (p.item != null || (q = p.next) == null) {
496                if (o != null && p.prev != p &&
497                    NEXT.compareAndSet(first, next, p)) {
498                    skipDeletedPredecessors(p);
499                    if (first.prev == null &&
500                        (p.next == null || p.item != null) &&
501                        p.prev == first) {
502
503                        updateHead(); // Ensure o is not reachable from head
504                        updateTail(); // Ensure o is not reachable from tail
505
506                        // Finally, actually gc-unlink
507                        NEXT.setRelease(o, o);
508                        PREV.setRelease(o, prevTerminator());
509                    }
510                }
511                return;
512            }
513            else if (p == q)
514                return;
515            else {
516                o = p;
517                p = q;
518            }
519        }
520    }
521
522    /**
523     * Unlinks non-null last node.
524     */
525    private void unlinkLast(Node<E> last, Node<E> prev) {
526        // assert last != null;
527        // assert prev != null;
528        // assert last.item == null;
529        for (Node<E> o = null, p = prev, q;;) {
530            if (p.item != null || (q = p.prev) == null) {
531                if (o != null && p.next != p &&
532                    PREV.compareAndSet(last, prev, p)) {
533                    skipDeletedSuccessors(p);
534                    if (last.next == null &&
535                        (p.prev == null || p.item != null) &&
536                        p.next == last) {
537
538                        updateHead(); // Ensure o is not reachable from head
539                        updateTail(); // Ensure o is not reachable from tail
540
541                        // Finally, actually gc-unlink
542                        PREV.setRelease(o, o);
543                        NEXT.setRelease(o, nextTerminator());
544                    }
545                }
546                return;
547            }
548            else if (p == q)
549                return;
550            else {
551                o = p;
552                p = q;
553            }
554        }
555    }
556
557    /**
558     * Guarantees that any node which was unlinked before a call to
559     * this method will be unreachable from head after it returns.
560     * Does not guarantee to eliminate slack, only that head will
561     * point to a node that was active while this method was running.
562     */
563    private final void updateHead() {
564        // Either head already points to an active node, or we keep
565        // trying to cas it to the first node until it does.
566        Node<E> h, p, q;
567        restartFromHead:
568        while ((h = head).item == null && (p = h.prev) != null) {
569            for (;;) {
570                if ((q = p.prev) == null ||
571                    (q = (p = q).prev) == null) {
572                    // It is possible that p is PREV_TERMINATOR,
573                    // but if so, the CAS is guaranteed to fail.
574                    if (HEAD.compareAndSet(this, h, p))
575                        return;
576                    else
577                        continue restartFromHead;
578                }
579                else if (h != head)
580                    continue restartFromHead;
581                else
582                    p = q;
583            }
584        }
585    }
586
587    /**
588     * Guarantees that any node which was unlinked before a call to
589     * this method will be unreachable from tail after it returns.
590     * Does not guarantee to eliminate slack, only that tail will
591     * point to a node that was active while this method was running.
592     */
593    private final void updateTail() {
594        // Either tail already points to an active node, or we keep
595        // trying to cas it to the last node until it does.
596        Node<E> t, p, q;
597        restartFromTail:
598        while ((t = tail).item == null && (p = t.next) != null) {
599            for (;;) {
600                if ((q = p.next) == null ||
601                    (q = (p = q).next) == null) {
602                    // It is possible that p is NEXT_TERMINATOR,
603                    // but if so, the CAS is guaranteed to fail.
604                    if (TAIL.compareAndSet(this, t, p))
605                        return;
606                    else
607                        continue restartFromTail;
608                }
609                else if (t != tail)
610                    continue restartFromTail;
611                else
612                    p = q;
613            }
614        }
615    }
616
617    private void skipDeletedPredecessors(Node<E> x) {
618        whileActive:
619        do {
620            Node<E> prev = x.prev;
621            // assert prev != null;
622            // assert x != NEXT_TERMINATOR;
623            // assert x != PREV_TERMINATOR;
624            Node<E> p = prev;
625            findActive:
626            for (;;) {
627                if (p.item != null)
628                    break findActive;
629                Node<E> q = p.prev;
630                if (q == null) {
631                    if (p.next == p)
632                        continue whileActive;
633                    break findActive;
634                }
635                else if (p == q)
636                    continue whileActive;
637                else
638                    p = q;
639            }
640
641            // found active CAS target
642            if (prev == p || PREV.compareAndSet(x, prev, p))
643                return;
644
645        } while (x.item != null || x.next == null);
646    }
647
648    private void skipDeletedSuccessors(Node<E> x) {
649        whileActive:
650        do {
651            Node<E> next = x.next;
652            // assert next != null;
653            // assert x != NEXT_TERMINATOR;
654            // assert x != PREV_TERMINATOR;
655            Node<E> p = next;
656            findActive:
657            for (;;) {
658                if (p.item != null)
659                    break findActive;
660                Node<E> q = p.next;
661                if (q == null) {
662                    if (p.prev == p)
663                        continue whileActive;
664                    break findActive;
665                }
666                else if (p == q)
667                    continue whileActive;
668                else
669                    p = q;
670            }
671
672            // found active CAS target
673            if (next == p || NEXT.compareAndSet(x, next, p))
674                return;
675
676        } while (x.item != null || x.prev == null);
677    }
678
679    /**
680     * Returns the successor of p, or the first node if p.next has been
681     * linked to self, which will only be true if traversing with a
682     * stale pointer that is now off the list.
683     */
684    final Node<E> succ(Node<E> p) {
685        // TODO: should we skip deleted nodes here?
686        if (p == (p = p.next))
687            p = first();
688        return p;
689    }
690
691    /**
692     * Returns the predecessor of p, or the last node if p.prev has been
693     * linked to self, which will only be true if traversing with a
694     * stale pointer that is now off the list.
695     */
696    final Node<E> pred(Node<E> p) {
697        Node<E> q = p.prev;
698        return (p == q) ? last() : q;
699    }
700
701    /**
702     * Returns the first node, the unique node p for which:
703     *     p.prev == null && p.next != p
704     * The returned node may or may not be logically deleted.
705     * Guarantees that head is set to the returned node.
706     */
707    Node<E> first() {
708        restartFromHead:
709        for (;;)
710            for (Node<E> h = head, p = h, q;;) {
711                if ((q = p.prev) != null &&
712                    (q = (p = q).prev) != null)
713                    // Check for head updates every other hop.
714                    // If p == q, we are sure to follow head instead.
715                    p = (h != (h = head)) ? h : q;
716                else if (p == h
717                         // It is possible that p is PREV_TERMINATOR,
718                         // but if so, the CAS is guaranteed to fail.
719                         || HEAD.compareAndSet(this, h, p))
720                    return p;
721                else
722                    continue restartFromHead;
723            }
724    }
725
726    /**
727     * Returns the last node, the unique node p for which:
728     *     p.next == null && p.prev != p
729     * The returned node may or may not be logically deleted.
730     * Guarantees that tail is set to the returned node.
731     */
732    Node<E> last() {
733        restartFromTail:
734        for (;;)
735            for (Node<E> t = tail, p = t, q;;) {
736                if ((q = p.next) != null &&
737                    (q = (p = q).next) != null)
738                    // Check for tail updates every other hop.
739                    // If p == q, we are sure to follow tail instead.
740                    p = (t != (t = tail)) ? t : q;
741                else if (p == t
742                         // It is possible that p is NEXT_TERMINATOR,
743                         // but if so, the CAS is guaranteed to fail.
744                         || TAIL.compareAndSet(this, t, p))
745                    return p;
746                else
747                    continue restartFromTail;
748            }
749    }
750
751    // Minor convenience utilities
752
753    /**
754     * Returns element unless it is null, in which case throws
755     * NoSuchElementException.
756     *
757     * @param v the element
758     * @return the element
759     */
760    private E screenNullResult(E v) {
761        if (v == null)
762            throw new NoSuchElementException();
763        return v;
764    }
765
766    /**
767     * Constructs an empty deque.
768     */
769    public ConcurrentLinkedDeque() {
770        head = tail = new Node<E>();
771    }
772
773    /**
774     * Constructs a deque initially containing the elements of
775     * the given collection, added in traversal order of the
776     * collection's iterator.
777     *
778     * @param c the collection of elements to initially contain
779     * @throws NullPointerException if the specified collection or any
780     *         of its elements are null
781     */
782    public ConcurrentLinkedDeque(Collection<? extends E> c) {
783        // Copy c into a private chain of Nodes
784        Node<E> h = null, t = null;
785        for (E e : c) {
786            Node<E> newNode = newNode(Objects.requireNonNull(e));
787            if (h == null)
788                h = t = newNode;
789            else {
790                NEXT.set(t, newNode);
791                PREV.set(newNode, t);
792                t = newNode;
793            }
794        }
795        initHeadTail(h, t);
796    }
797
798    /**
799     * Initializes head and tail, ensuring invariants hold.
800     */
801    private void initHeadTail(Node<E> h, Node<E> t) {
802        if (h == t) {
803            if (h == null)
804                h = t = new Node<E>();
805            else {
806                // Avoid edge case of a single Node with non-null item.
807                Node<E> newNode = new Node<E>();
808                NEXT.set(t, newNode);
809                PREV.set(newNode, t);
810                t = newNode;
811            }
812        }
813        head = h;
814        tail = t;
815    }
816
817    /**
818     * Inserts the specified element at the front of this deque.
819     * As the deque is unbounded, this method will never throw
820     * {@link IllegalStateException}.
821     *
822     * @throws NullPointerException if the specified element is null
823     */
824    public void addFirst(E e) {
825        linkFirst(e);
826    }
827
828    /**
829     * Inserts the specified element at the end of this deque.
830     * As the deque is unbounded, this method will never throw
831     * {@link IllegalStateException}.
832     *
833     * <p>This method is equivalent to {@link #add}.
834     *
835     * @throws NullPointerException if the specified element is null
836     */
837    public void addLast(E e) {
838        linkLast(e);
839    }
840
841    /**
842     * Inserts the specified element at the front of this deque.
843     * As the deque is unbounded, this method will never return {@code false}.
844     *
845     * @return {@code true} (as specified by {@link Deque#offerFirst})
846     * @throws NullPointerException if the specified element is null
847     */
848    public boolean offerFirst(E e) {
849        linkFirst(e);
850        return true;
851    }
852
853    /**
854     * Inserts the specified element at the end of this deque.
855     * As the deque is unbounded, this method will never return {@code false}.
856     *
857     * <p>This method is equivalent to {@link #add}.
858     *
859     * @return {@code true} (as specified by {@link Deque#offerLast})
860     * @throws NullPointerException if the specified element is null
861     */
862    public boolean offerLast(E e) {
863        linkLast(e);
864        return true;
865    }
866
867    public E peekFirst() {
868        for (Node<E> p = first(); p != null; p = succ(p)) {
869            final E item;
870            if ((item = p.item) != null)
871                return item;
872        }
873        return null;
874    }
875
876    public E peekLast() {
877        for (Node<E> p = last(); p != null; p = pred(p)) {
878            final E item;
879            if ((item = p.item) != null)
880                return item;
881        }
882        return null;
883    }
884
885    /**
886     * @throws NoSuchElementException {@inheritDoc}
887     */
888    public E getFirst() {
889        return screenNullResult(peekFirst());
890    }
891
892    /**
893     * @throws NoSuchElementException {@inheritDoc}
894     */
895    public E getLast() {
896        return screenNullResult(peekLast());
897    }
898
899    public E pollFirst() {
900        for (Node<E> p = first(); p != null; p = succ(p)) {
901            final E item;
902            if ((item = p.item) != null
903                && ITEM.compareAndSet(p, item, null)) {
904                unlink(p);
905                return item;
906            }
907        }
908        return null;
909    }
910
911    public E pollLast() {
912        for (Node<E> p = last(); p != null; p = pred(p)) {
913            final E item;
914            if ((item = p.item) != null
915                && ITEM.compareAndSet(p, item, null)) {
916                unlink(p);
917                return item;
918            }
919        }
920        return null;
921    }
922
923    /**
924     * @throws NoSuchElementException {@inheritDoc}
925     */
926    public E removeFirst() {
927        return screenNullResult(pollFirst());
928    }
929
930    /**
931     * @throws NoSuchElementException {@inheritDoc}
932     */
933    public E removeLast() {
934        return screenNullResult(pollLast());
935    }
936
937    // *** Queue and stack methods ***
938
939    /**
940     * Inserts the specified element at the tail of this deque.
941     * As the deque is unbounded, this method will never return {@code false}.
942     *
943     * @return {@code true} (as specified by {@link Queue#offer})
944     * @throws NullPointerException if the specified element is null
945     */
946    public boolean offer(E e) {
947        return offerLast(e);
948    }
949
950    /**
951     * Inserts the specified element at the tail of this deque.
952     * As the deque is unbounded, this method will never throw
953     * {@link IllegalStateException} or return {@code false}.
954     *
955     * @return {@code true} (as specified by {@link Collection#add})
956     * @throws NullPointerException if the specified element is null
957     */
958    public boolean add(E e) {
959        return offerLast(e);
960    }
961
962    public E poll()           { return pollFirst(); }
963    public E peek()           { return peekFirst(); }
964
965    /**
966     * @throws NoSuchElementException {@inheritDoc}
967     */
968    public E remove()         { return removeFirst(); }
969
970    /**
971     * @throws NoSuchElementException {@inheritDoc}
972     */
973    public E pop()            { return removeFirst(); }
974
975    /**
976     * @throws NoSuchElementException {@inheritDoc}
977     */
978    public E element()        { return getFirst(); }
979
980    /**
981     * @throws NullPointerException {@inheritDoc}
982     */
983    public void push(E e)     { addFirst(e); }
984
985    /**
986     * Removes the first occurrence of the specified element from this deque.
987     * If the deque does not contain the element, it is unchanged.
988     * More formally, removes the first element {@code e} such that
989     * {@code o.equals(e)} (if such an element exists).
990     * Returns {@code true} if this deque contained the specified element
991     * (or equivalently, if this deque changed as a result of the call).
992     *
993     * @param o element to be removed from this deque, if present
994     * @return {@code true} if the deque contained the specified element
995     * @throws NullPointerException if the specified element is null
996     */
997    public boolean removeFirstOccurrence(Object o) {
998        Objects.requireNonNull(o);
999        for (Node<E> p = first(); p != null; p = succ(p)) {
1000            final E item;
1001            if ((item = p.item) != null
1002                && o.equals(item)
1003                && ITEM.compareAndSet(p, item, null)) {
1004                unlink(p);
1005                return true;
1006            }
1007        }
1008        return false;
1009    }
1010
1011    /**
1012     * Removes the last occurrence of the specified element from this deque.
1013     * If the deque does not contain the element, it is unchanged.
1014     * More formally, removes the last element {@code e} such that
1015     * {@code o.equals(e)} (if such an element exists).
1016     * Returns {@code true} if this deque contained the specified element
1017     * (or equivalently, if this deque changed as a result of the call).
1018     *
1019     * @param o element to be removed from this deque, if present
1020     * @return {@code true} if the deque contained the specified element
1021     * @throws NullPointerException if the specified element is null
1022     */
1023    public boolean removeLastOccurrence(Object o) {
1024        Objects.requireNonNull(o);
1025        for (Node<E> p = last(); p != null; p = pred(p)) {
1026            final E item;
1027            if ((item = p.item) != null
1028                && o.equals(item)
1029                && ITEM.compareAndSet(p, item, null)) {
1030                unlink(p);
1031                return true;
1032            }
1033        }
1034        return false;
1035    }
1036
1037    /**
1038     * Returns {@code true} if this deque contains the specified element.
1039     * More formally, returns {@code true} if and only if this deque contains
1040     * at least one element {@code e} such that {@code o.equals(e)}.
1041     *
1042     * @param o element whose presence in this deque is to be tested
1043     * @return {@code true} if this deque contains the specified element
1044     */
1045    public boolean contains(Object o) {
1046        if (o != null) {
1047            for (Node<E> p = first(); p != null; p = succ(p)) {
1048                final E item;
1049                if ((item = p.item) != null && o.equals(item))
1050                    return true;
1051            }
1052        }
1053        return false;
1054    }
1055
1056    /**
1057     * Returns {@code true} if this collection contains no elements.
1058     *
1059     * @return {@code true} if this collection contains no elements
1060     */
1061    public boolean isEmpty() {
1062        return peekFirst() == null;
1063    }
1064
1065    /**
1066     * Returns the number of elements in this deque.  If this deque
1067     * contains more than {@code Integer.MAX_VALUE} elements, it
1068     * returns {@code Integer.MAX_VALUE}.
1069     *
1070     * <p>Beware that, unlike in most collections, this method is
1071     * <em>NOT</em> a constant-time operation. Because of the
1072     * asynchronous nature of these deques, determining the current
1073     * number of elements requires traversing them all to count them.
1074     * Additionally, it is possible for the size to change during
1075     * execution of this method, in which case the returned result
1076     * will be inaccurate. Thus, this method is typically not very
1077     * useful in concurrent applications.
1078     *
1079     * @return the number of elements in this deque
1080     */
1081    public int size() {
1082        restartFromHead: for (;;) {
1083            int count = 0;
1084            for (Node<E> p = first(); p != null;) {
1085                if (p.item != null)
1086                    if (++count == Integer.MAX_VALUE)
1087                        break;  // @see Collection.size()
1088                if (p == (p = p.next))
1089                    continue restartFromHead;
1090            }
1091            return count;
1092        }
1093    }
1094
1095    /**
1096     * Removes the first occurrence of the specified element from this deque.
1097     * If the deque does not contain the element, it is unchanged.
1098     * More formally, removes the first element {@code e} such that
1099     * {@code o.equals(e)} (if such an element exists).
1100     * Returns {@code true} if this deque contained the specified element
1101     * (or equivalently, if this deque changed as a result of the call).
1102     *
1103     * <p>This method is equivalent to {@link #removeFirstOccurrence(Object)}.
1104     *
1105     * @param o element to be removed from this deque, if present
1106     * @return {@code true} if the deque contained the specified element
1107     * @throws NullPointerException if the specified element is null
1108     */
1109    public boolean remove(Object o) {
1110        return removeFirstOccurrence(o);
1111    }
1112
1113    /**
1114     * Appends all of the elements in the specified collection to the end of
1115     * this deque, in the order that they are returned by the specified
1116     * collection's iterator.  Attempts to {@code addAll} of a deque to
1117     * itself result in {@code IllegalArgumentException}.
1118     *
1119     * @param c the elements to be inserted into this deque
1120     * @return {@code true} if this deque changed as a result of the call
1121     * @throws NullPointerException if the specified collection or any
1122     *         of its elements are null
1123     * @throws IllegalArgumentException if the collection is this deque
1124     */
1125    public boolean addAll(Collection<? extends E> c) {
1126        if (c == this)
1127            // As historically specified in AbstractQueue#addAll
1128            throw new IllegalArgumentException();
1129
1130        // Copy c into a private chain of Nodes
1131        Node<E> beginningOfTheEnd = null, last = null;
1132        for (E e : c) {
1133            Node<E> newNode = newNode(Objects.requireNonNull(e));
1134            if (beginningOfTheEnd == null)
1135                beginningOfTheEnd = last = newNode;
1136            else {
1137                NEXT.set(last, newNode);
1138                PREV.set(newNode, last);
1139                last = newNode;
1140            }
1141        }
1142        if (beginningOfTheEnd == null)
1143            return false;
1144
1145        // Atomically append the chain at the tail of this collection
1146        restartFromTail:
1147        for (;;)
1148            for (Node<E> t = tail, p = t, q;;) {
1149                if ((q = p.next) != null &&
1150                    (q = (p = q).next) != null)
1151                    // Check for tail updates every other hop.
1152                    // If p == q, we are sure to follow tail instead.
1153                    p = (t != (t = tail)) ? t : q;
1154                else if (p.prev == p) // NEXT_TERMINATOR
1155                    continue restartFromTail;
1156                else {
1157                    // p is last node
1158                    PREV.set(beginningOfTheEnd, p); // CAS piggyback
1159                    if (NEXT.compareAndSet(p, null, beginningOfTheEnd)) {
1160                        // Successful CAS is the linearization point
1161                        // for all elements to be added to this deque.
1162                        if (!TAIL.weakCompareAndSet(this, t, last)) {
1163                            // Try a little harder to update tail,
1164                            // since we may be adding many elements.
1165                            t = tail;
1166                            if (last.next == null)
1167                                TAIL.weakCompareAndSet(this, t, last);
1168                        }
1169                        return true;
1170                    }
1171                    // Lost CAS race to another thread; re-read next
1172                }
1173            }
1174    }
1175
1176    /**
1177     * Removes all of the elements from this deque.
1178     */
1179    public void clear() {
1180        while (pollFirst() != null)
1181            ;
1182    }
1183
1184    public String toString() {
1185        String[] a = null;
1186        restartFromHead: for (;;) {
1187            int charLength = 0;
1188            int size = 0;
1189            for (Node<E> p = first(); p != null;) {
1190                final E item;
1191                if ((item = p.item) != null) {
1192                    if (a == null)
1193                        a = new String[4];
1194                    else if (size == a.length)
1195                        a = Arrays.copyOf(a, 2 * size);
1196                    String s = item.toString();
1197                    a[size++] = s;
1198                    charLength += s.length();
1199                }
1200                if (p == (p = p.next))
1201                    continue restartFromHead;
1202            }
1203
1204            if (size == 0)
1205                return "[]";
1206
1207            return Helpers.toString(a, size, charLength);
1208        }
1209    }
1210
1211    private Object[] toArrayInternal(Object[] a) {
1212        Object[] x = a;
1213        restartFromHead: for (;;) {
1214            int size = 0;
1215            for (Node<E> p = first(); p != null;) {
1216                final E item;
1217                if ((item = p.item) != null) {
1218                    if (x == null)
1219                        x = new Object[4];
1220                    else if (size == x.length)
1221                        x = Arrays.copyOf(x, 2 * (size + 4));
1222                    x[size++] = item;
1223                }
1224                if (p == (p = p.next))
1225                    continue restartFromHead;
1226            }
1227            if (x == null)
1228                return new Object[0];
1229            else if (a != null && size <= a.length) {
1230                if (a != x)
1231                    System.arraycopy(x, 0, a, 0, size);
1232                if (size < a.length)
1233                    a[size] = null;
1234                return a;
1235            }
1236            return (size == x.length) ? x : Arrays.copyOf(x, size);
1237        }
1238    }
1239
1240    /**
1241     * Returns an array containing all of the elements in this deque, in
1242     * proper sequence (from first to last element).
1243     *
1244     * <p>The returned array will be "safe" in that no references to it are
1245     * maintained by this deque.  (In other words, this method must allocate
1246     * a new array).  The caller is thus free to modify the returned array.
1247     *
1248     * <p>This method acts as bridge between array-based and collection-based
1249     * APIs.
1250     *
1251     * @return an array containing all of the elements in this deque
1252     */
1253    public Object[] toArray() {
1254        return toArrayInternal(null);
1255    }
1256
1257    /**
1258     * Returns an array containing all of the elements in this deque,
1259     * in proper sequence (from first to last element); the runtime
1260     * type of the returned array is that of the specified array.  If
1261     * the deque fits in the specified array, it is returned therein.
1262     * Otherwise, a new array is allocated with the runtime type of
1263     * the specified array and the size of this deque.
1264     *
1265     * <p>If this deque fits in the specified array with room to spare
1266     * (i.e., the array has more elements than this deque), the element in
1267     * the array immediately following the end of the deque is set to
1268     * {@code null}.
1269     *
1270     * <p>Like the {@link #toArray()} method, this method acts as
1271     * bridge between array-based and collection-based APIs.  Further,
1272     * this method allows precise control over the runtime type of the
1273     * output array, and may, under certain circumstances, be used to
1274     * save allocation costs.
1275     *
1276     * <p>Suppose {@code x} is a deque known to contain only strings.
1277     * The following code can be used to dump the deque into a newly
1278     * allocated array of {@code String}:
1279     *
1280     * <pre> {@code String[] y = x.toArray(new String[0]);}</pre>
1281     *
1282     * Note that {@code toArray(new Object[0])} is identical in function to
1283     * {@code toArray()}.
1284     *
1285     * @param a the array into which the elements of the deque are to
1286     *          be stored, if it is big enough; otherwise, a new array of the
1287     *          same runtime type is allocated for this purpose
1288     * @return an array containing all of the elements in this deque
1289     * @throws ArrayStoreException if the runtime type of the specified array
1290     *         is not a supertype of the runtime type of every element in
1291     *         this deque
1292     * @throws NullPointerException if the specified array is null
1293     */
1294    @SuppressWarnings("unchecked")
1295    public <T> T[] toArray(T[] a) {
1296        if (a == null) throw new NullPointerException();
1297        return (T[]) toArrayInternal(a);
1298    }
1299
1300    /**
1301     * Returns an iterator over the elements in this deque in proper sequence.
1302     * The elements will be returned in order from first (head) to last (tail).
1303     *
1304     * <p>The returned iterator is
1305     * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
1306     *
1307     * @return an iterator over the elements in this deque in proper sequence
1308     */
1309    public Iterator<E> iterator() {
1310        return new Itr();
1311    }
1312
1313    /**
1314     * Returns an iterator over the elements in this deque in reverse
1315     * sequential order.  The elements will be returned in order from
1316     * last (tail) to first (head).
1317     *
1318     * <p>The returned iterator is
1319     * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
1320     *
1321     * @return an iterator over the elements in this deque in reverse order
1322     */
1323    public Iterator<E> descendingIterator() {
1324        return new DescendingItr();
1325    }
1326
1327    private abstract class AbstractItr implements Iterator<E> {
1328        /**
1329         * Next node to return item for.
1330         */
1331        private Node<E> nextNode;
1332
1333        /**
1334         * nextItem holds on to item fields because once we claim
1335         * that an element exists in hasNext(), we must return it in
1336         * the following next() call even if it was in the process of
1337         * being removed when hasNext() was called.
1338         */
1339        private E nextItem;
1340
1341        /**
1342         * Node returned by most recent call to next. Needed by remove.
1343         * Reset to null if this element is deleted by a call to remove.
1344         */
1345        private Node<E> lastRet;
1346
1347        abstract Node<E> startNode();
1348        abstract Node<E> nextNode(Node<E> p);
1349
1350        AbstractItr() {
1351            advance();
1352        }
1353
1354        /**
1355         * Sets nextNode and nextItem to next valid node, or to null
1356         * if no such.
1357         */
1358        private void advance() {
1359            lastRet = nextNode;
1360
1361            Node<E> p = (nextNode == null) ? startNode() : nextNode(nextNode);
1362            for (;; p = nextNode(p)) {
1363                if (p == null) {
1364                    // might be at active end or TERMINATOR node; both are OK
1365                    nextNode = null;
1366                    nextItem = null;
1367                    break;
1368                }
1369                final E item;
1370                if ((item = p.item) != null) {
1371                    nextNode = p;
1372                    nextItem = item;
1373                    break;
1374                }
1375            }
1376        }
1377
1378        public boolean hasNext() {
1379            return nextItem != null;
1380        }
1381
1382        public E next() {
1383            E item = nextItem;
1384            if (item == null) throw new NoSuchElementException();
1385            advance();
1386            return item;
1387        }
1388
1389        public void remove() {
1390            Node<E> l = lastRet;
1391            if (l == null) throw new IllegalStateException();
1392            l.item = null;
1393            unlink(l);
1394            lastRet = null;
1395        }
1396    }
1397
1398    /** Forward iterator */
1399    private class Itr extends AbstractItr {
1400        Itr() {}                        // prevent access constructor creation
1401        Node<E> startNode() { return first(); }
1402        Node<E> nextNode(Node<E> p) { return succ(p); }
1403    }
1404
1405    /** Descending iterator */
1406    private class DescendingItr extends AbstractItr {
1407        DescendingItr() {}              // prevent access constructor creation
1408        Node<E> startNode() { return last(); }
1409        Node<E> nextNode(Node<E> p) { return pred(p); }
1410    }
1411
1412    /** A customized variant of Spliterators.IteratorSpliterator */
1413    final class CLDSpliterator implements Spliterator<E> {
1414        static final int MAX_BATCH = 1 << 25;  // max batch array size;
1415        Node<E> current;    // current node; null until initialized
1416        int batch;          // batch size for splits
1417        boolean exhausted;  // true when no more nodes
1418
1419        public Spliterator<E> trySplit() {
1420            Node<E> p, q;
1421            if ((p = current()) == null || (q = p.next) == null)
1422                return null;
1423            int i = 0, n = batch = Math.min(batch + 1, MAX_BATCH);
1424            Object[] a = null;
1425            do {
1426                final E e;
1427                if ((e = p.item) != null) {
1428                    if (a == null)
1429                        a = new Object[n];
1430                    a[i++] = e;
1431                }
1432                if (p == (p = q))
1433                    p = first();
1434            } while (p != null && (q = p.next) != null && i < n);
1435            setCurrent(p);
1436            return (i == 0) ? null :
1437                Spliterators.spliterator(a, 0, i, (Spliterator.ORDERED |
1438                                                   Spliterator.NONNULL |
1439                                                   Spliterator.CONCURRENT));
1440        }
1441
1442        public void forEachRemaining(Consumer<? super E> action) {
1443            Objects.requireNonNull(action);
1444            Node<E> p;
1445            if ((p = current()) != null) {
1446                current = null;
1447                exhausted = true;
1448                do {
1449                    final E e;
1450                    if ((e = p.item) != null)
1451                        action.accept(e);
1452                    if (p == (p = p.next))
1453                        p = first();
1454                } while (p != null);
1455            }
1456        }
1457
1458        public boolean tryAdvance(Consumer<? super E> action) {
1459            Objects.requireNonNull(action);
1460            Node<E> p;
1461            if ((p = current()) != null) {
1462                E e;
1463                do {
1464                    e = p.item;
1465                    if (p == (p = p.next))
1466                        p = first();
1467                } while (e == null && p != null);
1468                setCurrent(p);
1469                if (e != null) {
1470                    action.accept(e);
1471                    return true;
1472                }
1473            }
1474            return false;
1475        }
1476
1477        private void setCurrent(Node<E> p) {
1478            if ((current = p) == null)
1479                exhausted = true;
1480        }
1481
1482        private Node<E> current() {
1483            Node<E> p;
1484            if ((p = current) == null && !exhausted)
1485                setCurrent(p = first());
1486            return p;
1487        }
1488
1489        public long estimateSize() { return Long.MAX_VALUE; }
1490
1491        public int characteristics() {
1492            return (Spliterator.ORDERED |
1493                    Spliterator.NONNULL |
1494                    Spliterator.CONCURRENT);
1495        }
1496    }
1497
1498    /**
1499     * Returns a {@link Spliterator} over the elements in this deque.
1500     *
1501     * <p>The returned spliterator is
1502     * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
1503     *
1504     * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
1505     * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
1506     *
1507     * @implNote
1508     * The {@code Spliterator} implements {@code trySplit} to permit limited
1509     * parallelism.
1510     *
1511     * @return a {@code Spliterator} over the elements in this deque
1512     * @since 1.8
1513     */
1514    public Spliterator<E> spliterator() {
1515        return new CLDSpliterator();
1516    }
1517
1518    /**
1519     * Saves this deque to a stream (that is, serializes it).
1520     *
1521     * @param s the stream
1522     * @throws java.io.IOException if an I/O error occurs
1523     * @serialData All of the elements (each an {@code E}) in
1524     * the proper order, followed by a null
1525     */
1526    private void writeObject(java.io.ObjectOutputStream s)
1527        throws java.io.IOException {
1528
1529        // Write out any hidden stuff
1530        s.defaultWriteObject();
1531
1532        // Write out all elements in the proper order.
1533        for (Node<E> p = first(); p != null; p = succ(p)) {
1534            final E item;
1535            if ((item = p.item) != null)
1536                s.writeObject(item);
1537        }
1538
1539        // Use trailing null as sentinel
1540        s.writeObject(null);
1541    }
1542
1543    /**
1544     * Reconstitutes this deque from a stream (that is, deserializes it).
1545     * @param s the stream
1546     * @throws ClassNotFoundException if the class of a serialized object
1547     *         could not be found
1548     * @throws java.io.IOException if an I/O error occurs
1549     */
1550    private void readObject(java.io.ObjectInputStream s)
1551        throws java.io.IOException, ClassNotFoundException {
1552        s.defaultReadObject();
1553
1554        // Read in elements until trailing null sentinel found
1555        Node<E> h = null, t = null;
1556        for (Object item; (item = s.readObject()) != null; ) {
1557            @SuppressWarnings("unchecked")
1558            Node<E> newNode = newNode((E) item);
1559            if (h == null)
1560                h = t = newNode;
1561            else {
1562                NEXT.set(t, newNode);
1563                PREV.set(newNode, t);
1564                t = newNode;
1565            }
1566        }
1567        initHeadTail(h, t);
1568    }
1569
1570    /**
1571     * @throws NullPointerException {@inheritDoc}
1572     */
1573    public boolean removeIf(Predicate<? super E> filter) {
1574        Objects.requireNonNull(filter);
1575        return bulkRemove(filter);
1576    }
1577
1578    /**
1579     * @throws NullPointerException {@inheritDoc}
1580     */
1581    public boolean removeAll(Collection<?> c) {
1582        Objects.requireNonNull(c);
1583        return bulkRemove(e -> c.contains(e));
1584    }
1585
1586    /**
1587     * @throws NullPointerException {@inheritDoc}
1588     */
1589    public boolean retainAll(Collection<?> c) {
1590        Objects.requireNonNull(c);
1591        return bulkRemove(e -> !c.contains(e));
1592    }
1593
1594    /** Implementation of bulk remove methods. */
1595    private boolean bulkRemove(Predicate<? super E> filter) {
1596        boolean removed = false;
1597        for (Node<E> p = first(), succ; p != null; p = succ) {
1598            succ = succ(p);
1599            final E item;
1600            if ((item = p.item) != null
1601                && filter.test(item)
1602                && ITEM.compareAndSet(p, item, null)) {
1603                unlink(p);
1604                removed = true;
1605            }
1606        }
1607        return removed;
1608    }
1609
1610    /**
1611     * @throws NullPointerException {@inheritDoc}
1612     */
1613    public void forEach(Consumer<? super E> action) {
1614        Objects.requireNonNull(action);
1615        E item;
1616        for (Node<E> p = first(); p != null; p = succ(p))
1617            if ((item = p.item) != null)
1618                action.accept(item);
1619    }
1620
1621    // VarHandle mechanics
1622    private static final VarHandle HEAD;
1623    private static final VarHandle TAIL;
1624    private static final VarHandle PREV;
1625    private static final VarHandle NEXT;
1626    private static final VarHandle ITEM;
1627    static {
1628        PREV_TERMINATOR = new Node<Object>();
1629        PREV_TERMINATOR.next = PREV_TERMINATOR;
1630        NEXT_TERMINATOR = new Node<Object>();
1631        NEXT_TERMINATOR.prev = NEXT_TERMINATOR;
1632        try {
1633            MethodHandles.Lookup l = MethodHandles.lookup();
1634            HEAD = l.findVarHandle(ConcurrentLinkedDeque.class, "head",
1635                                   Node.class);
1636            TAIL = l.findVarHandle(ConcurrentLinkedDeque.class, "tail",
1637                                   Node.class);
1638            PREV = l.findVarHandle(Node.class, "prev", Node.class);
1639            NEXT = l.findVarHandle(Node.class, "next", Node.class);
1640            ITEM = l.findVarHandle(Node.class, "item", Object.class);
1641        } catch (ReflectiveOperationException e) {
1642            throw new Error(e);
1643        }
1644    }
1645}
1646