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 with assistance from members of JCP JSR-166
32  * Expert Group and released to the public domain, as explained at
33  * http://creativecommons.org/publicdomain/zero/1.0/
34  */

35
36 package java.util.concurrent;
37
38 import java.util.AbstractQueue;
39 import java.util.Collection;
40 import java.util.Iterator;
41 import java.util.NoSuchElementException;
42 import java.util.Objects;
43 import java.util.Spliterator;
44 import java.util.Spliterators;
45 import java.util.concurrent.locks.Condition;
46 import java.util.concurrent.locks.ReentrantLock;
47 import java.util.function.Consumer;
48 import java.util.function.Predicate;
49
50 /**
51  * An optionally-bounded {@linkplain BlockingDeque blocking deque} based on
52  * linked nodes.
53  *
54  * <p>The optional capacity bound constructor argument serves as a
55  * way to prevent excessive expansion. The capacity, if unspecified,
56  * is equal to {@link Integer#MAX_VALUE}.  Linked nodes are
57  * dynamically created upon each insertion unless this would bring the
58  * deque above capacity.
59  *
60  * <p>Most operations run in constant time (ignoring time spent
61  * blocking).  Exceptions include {@link #remove(Object) remove},
62  * {@link #removeFirstOccurrence removeFirstOccurrence}, {@link
63  * #removeLastOccurrence removeLastOccurrence}, {@link #contains
64  * contains}, {@link #iterator iterator.remove()}, and the bulk
65  * operations, all of which run in linear time.
66  *
67  * <p>This class and its iterator implement all of the <em>optional</em>
68  * methods of the {@link Collection} and {@link Iterator} interfaces.
69  *
70  * <p>This class is a member of the
71  * <a href="{@docRoot}/java.base/java/util/package-summary.html#CollectionsFramework">
72  * Java Collections Framework</a>.
73  *
74  * @since 1.6
75  * @author  Doug Lea
76  * @param <E> the type of elements held in this deque
77  */

78 public class LinkedBlockingDeque<E>
79     extends AbstractQueue<E>
80     implements BlockingDeque<E>, java.io.Serializable {
81
82     /*
83      * Implemented as a simple doubly-linked list protected by a
84      * single lock and using conditions to manage blocking.
85      *
86      * To implement weakly consistent iterators, it appears we need to
87      * keep all Nodes GC-reachable from a predecessor dequeued Node.
88      * That would cause two problems:
89      * - allow a rogue Iterator to cause unbounded memory retention
90      * - cause cross-generational linking of old Nodes to new Nodes if
91      *   a Node was tenured while live, which generational GCs have a
92      *   hard time dealing with, causing repeated major collections.
93      * However, only non-deleted Nodes need to be reachable from
94      * dequeued Nodes, and reachability does not necessarily have to
95      * be of the kind understood by the GC.  We use the trick of
96      * linking a Node that has just been dequeued to itself.  Such a
97      * self-link implicitly means to jump to "first" (for next links)
98      * or "last" (for prev links).
99      */

100
101     /*
102      * We have "diamond" multiple interface/abstract class inheritance
103      * here, and that introduces ambiguities. Often we want the
104      * BlockingDeque javadoc combined with the AbstractQueue
105      * implementation, so a lot of method specs are duplicated here.
106      */

107
108     private static final long serialVersionUID = -387911632671998426L;
109
110     /** Doubly-linked list node class */
111     static final class Node<E> {
112         /**
113          * The item, or null if this node has been removed.
114          */

115         E item;
116
117         /**
118          * One of:
119          * - the real predecessor Node
120          * - this Node, meaning the predecessor is tail
121          * - null, meaning there is no predecessor
122          */

123         Node<E> prev;
124
125         /**
126          * One of:
127          * - the real successor Node
128          * - this Node, meaning the successor is head
129          * - null, meaning there is no successor
130          */

131         Node<E> next;
132
133         Node(E x) {
134             item = x;
135         }
136     }
137
138     /**
139      * Pointer to first node.
140      * Invariant: (first == null && last == null) ||
141      *            (first.prev == null && first.item != null)
142      */

143     transient Node<E> first;
144
145     /**
146      * Pointer to last node.
147      * Invariant: (first == null && last == null) ||
148      *            (last.next == null && last.item != null)
149      */

150     transient Node<E> last;
151
152     /** Number of items in the deque */
153     private transient int count;
154
155     /** Maximum number of items in the deque */
156     private final int capacity;
157
158     /** Main lock guarding all access */
159     final ReentrantLock lock = new ReentrantLock();
160
161     /** Condition for waiting takes */
162     private final Condition notEmpty = lock.newCondition();
163
164     /** Condition for waiting puts */
165     private final Condition notFull = lock.newCondition();
166
167     /**
168      * Creates a {@code LinkedBlockingDeque} with a capacity of
169      * {@link Integer#MAX_VALUE}.
170      */

171     public LinkedBlockingDeque() {
172         this(Integer.MAX_VALUE);
173     }
174
175     /**
176      * Creates a {@code LinkedBlockingDeque} with the given (fixed) capacity.
177      *
178      * @param capacity the capacity of this deque
179      * @throws IllegalArgumentException if {@code capacity} is less than 1
180      */

181     public LinkedBlockingDeque(int capacity) {
182         if (capacity <= 0) throw new IllegalArgumentException();
183         this.capacity = capacity;
184     }
185
186     /**
187      * Creates a {@code LinkedBlockingDeque} with a capacity of
188      * {@link Integer#MAX_VALUE}, initially containing the elements of
189      * the given collection, added in traversal order of the
190      * collection's iterator.
191      *
192      * @param c the collection of elements to initially contain
193      * @throws NullPointerException if the specified collection or any
194      *         of its elements are null
195      */

196     public LinkedBlockingDeque(Collection<? extends E> c) {
197         this(Integer.MAX_VALUE);
198         addAll(c);
199     }
200
201
202     // Basic linking and unlinking operations, called only while holding lock
203
204     /**
205      * Links node as first element, or returns false if full.
206      */

207     private boolean linkFirst(Node<E> node) {
208         // assert lock.isHeldByCurrentThread();
209         if (count >= capacity)
210             return false;
211         Node<E> f = first;
212         node.next = f;
213         first = node;
214         if (last == null)
215             last = node;
216         else
217             f.prev = node;
218         ++count;
219         notEmpty.signal();
220         return true;
221     }
222
223     /**
224      * Links node as last element, or returns false if full.
225      */

226     private boolean linkLast(Node<E> node) {
227         // assert lock.isHeldByCurrentThread();
228         if (count >= capacity)
229             return false;
230         Node<E> l = last;
231         node.prev = l;
232         last = node;
233         if (first == null)
234             first = node;
235         else
236             l.next = node;
237         ++count;
238         notEmpty.signal();
239         return true;
240     }
241
242     /**
243      * Removes and returns first element, or null if empty.
244      */

245     private E unlinkFirst() {
246         // assert lock.isHeldByCurrentThread();
247         Node<E> f = first;
248         if (f == null)
249             return null;
250         Node<E> n = f.next;
251         E item = f.item;
252         f.item = null;
253         f.next = f; // help GC
254         first = n;
255         if (n == null)
256             last = null;
257         else
258             n.prev = null;
259         --count;
260         notFull.signal();
261         return item;
262     }
263
264     /**
265      * Removes and returns last element, or null if empty.
266      */

267     private E unlinkLast() {
268         // assert lock.isHeldByCurrentThread();
269         Node<E> l = last;
270         if (l == null)
271             return null;
272         Node<E> p = l.prev;
273         E item = l.item;
274         l.item = null;
275         l.prev = l; // help GC
276         last = p;
277         if (p == null)
278             first = null;
279         else
280             p.next = null;
281         --count;
282         notFull.signal();
283         return item;
284     }
285
286     /**
287      * Unlinks x.
288      */

289     void unlink(Node<E> x) {
290         // assert lock.isHeldByCurrentThread();
291         // assert x.item != null;
292         Node<E> p = x.prev;
293         Node<E> n = x.next;
294         if (p == null) {
295             unlinkFirst();
296         } else if (n == null) {
297             unlinkLast();
298         } else {
299             p.next = n;
300             n.prev = p;
301             x.item = null;
302             // Don't mess with x's links.  They may still be in use by
303             // an iterator.
304             --count;
305             notFull.signal();
306         }
307     }
308
309     // BlockingDeque methods
310
311     /**
312      * @throws IllegalStateException if this deque is full
313      * @throws NullPointerException {@inheritDoc}
314      */

315     public void addFirst(E e) {
316         if (!offerFirst(e))
317             throw new IllegalStateException("Deque full");
318     }
319
320     /**
321      * @throws IllegalStateException if this deque is full
322      * @throws NullPointerException  {@inheritDoc}
323      */

324     public void addLast(E e) {
325         if (!offerLast(e))
326             throw new IllegalStateException("Deque full");
327     }
328
329     /**
330      * @throws NullPointerException {@inheritDoc}
331      */

332     public boolean offerFirst(E e) {
333         if (e == nullthrow new NullPointerException();
334         Node<E> node = new Node<E>(e);
335         final ReentrantLock lock = this.lock;
336         lock.lock();
337         try {
338             return linkFirst(node);
339         } finally {
340             lock.unlock();
341         }
342     }
343
344     /**
345      * @throws NullPointerException {@inheritDoc}
346      */

347     public boolean offerLast(E e) {
348         if (e == nullthrow new NullPointerException();
349         Node<E> node = new Node<E>(e);
350         final ReentrantLock lock = this.lock;
351         lock.lock();
352         try {
353             return linkLast(node);
354         } finally {
355             lock.unlock();
356         }
357     }
358
359     /**
360      * @throws NullPointerException {@inheritDoc}
361      * @throws InterruptedException {@inheritDoc}
362      */

363     public void putFirst(E e) throws InterruptedException {
364         if (e == nullthrow new NullPointerException();
365         Node<E> node = new Node<E>(e);
366         final ReentrantLock lock = this.lock;
367         lock.lock();
368         try {
369             while (!linkFirst(node))
370                 notFull.await();
371         } finally {
372             lock.unlock();
373         }
374     }
375
376     /**
377      * @throws NullPointerException {@inheritDoc}
378      * @throws InterruptedException {@inheritDoc}
379      */

380     public void putLast(E e) throws InterruptedException {
381         if (e == nullthrow new NullPointerException();
382         Node<E> node = new Node<E>(e);
383         final ReentrantLock lock = this.lock;
384         lock.lock();
385         try {
386             while (!linkLast(node))
387                 notFull.await();
388         } finally {
389             lock.unlock();
390         }
391     }
392
393     /**
394      * @throws NullPointerException {@inheritDoc}
395      * @throws InterruptedException {@inheritDoc}
396      */

397     public boolean offerFirst(E e, long timeout, TimeUnit unit)
398         throws InterruptedException {
399         if (e == nullthrow new NullPointerException();
400         Node<E> node = new Node<E>(e);
401         long nanos = unit.toNanos(timeout);
402         final ReentrantLock lock = this.lock;
403         lock.lockInterruptibly();
404         try {
405             while (!linkFirst(node)) {
406                 if (nanos <= 0L)
407                     return false;
408                 nanos = notFull.awaitNanos(nanos);
409             }
410             return true;
411         } finally {
412             lock.unlock();
413         }
414     }
415
416     /**
417      * @throws NullPointerException {@inheritDoc}
418      * @throws InterruptedException {@inheritDoc}
419      */

420     public boolean offerLast(E e, long timeout, TimeUnit unit)
421         throws InterruptedException {
422         if (e == nullthrow new NullPointerException();
423         Node<E> node = new Node<E>(e);
424         long nanos = unit.toNanos(timeout);
425         final ReentrantLock lock = this.lock;
426         lock.lockInterruptibly();
427         try {
428             while (!linkLast(node)) {
429                 if (nanos <= 0L)
430                     return false;
431                 nanos = notFull.awaitNanos(nanos);
432             }
433             return true;
434         } finally {
435             lock.unlock();
436         }
437     }
438
439     /**
440      * @throws NoSuchElementException {@inheritDoc}
441      */

442     public E removeFirst() {
443         E x = pollFirst();
444         if (x == nullthrow new NoSuchElementException();
445         return x;
446     }
447
448     /**
449      * @throws NoSuchElementException {@inheritDoc}
450      */

451     public E removeLast() {
452         E x = pollLast();
453         if (x == nullthrow new NoSuchElementException();
454         return x;
455     }
456
457     public E pollFirst() {
458         final ReentrantLock lock = this.lock;
459         lock.lock();
460         try {
461             return unlinkFirst();
462         } finally {
463             lock.unlock();
464         }
465     }
466
467     public E pollLast() {
468         final ReentrantLock lock = this.lock;
469         lock.lock();
470         try {
471             return unlinkLast();
472         } finally {
473             lock.unlock();
474         }
475     }
476
477     public E takeFirst() throws InterruptedException {
478         final ReentrantLock lock = this.lock;
479         lock.lock();
480         try {
481             E x;
482             while ( (x = unlinkFirst()) == null)
483                 notEmpty.await();
484             return x;
485         } finally {
486             lock.unlock();
487         }
488     }
489
490     public E takeLast() throws InterruptedException {
491         final ReentrantLock lock = this.lock;
492         lock.lock();
493         try {
494             E x;
495             while ( (x = unlinkLast()) == null)
496                 notEmpty.await();
497             return x;
498         } finally {
499             lock.unlock();
500         }
501     }
502
503     public E pollFirst(long timeout, TimeUnit unit)
504         throws InterruptedException {
505         long nanos = unit.toNanos(timeout);
506         final ReentrantLock lock = this.lock;
507         lock.lockInterruptibly();
508         try {
509             E x;
510             while ( (x = unlinkFirst()) == null) {
511                 if (nanos <= 0L)
512                     return null;
513                 nanos = notEmpty.awaitNanos(nanos);
514             }
515             return x;
516         } finally {
517             lock.unlock();
518         }
519     }
520
521     public E pollLast(long timeout, TimeUnit unit)
522         throws InterruptedException {
523         long nanos = unit.toNanos(timeout);
524         final ReentrantLock lock = this.lock;
525         lock.lockInterruptibly();
526         try {
527             E x;
528             while ( (x = unlinkLast()) == null) {
529                 if (nanos <= 0L)
530                     return null;
531                 nanos = notEmpty.awaitNanos(nanos);
532             }
533             return x;
534         } finally {
535             lock.unlock();
536         }
537     }
538
539     /**
540      * @throws NoSuchElementException {@inheritDoc}
541      */

542     public E getFirst() {
543         E x = peekFirst();
544         if (x == nullthrow new NoSuchElementException();
545         return x;
546     }
547
548     /**
549      * @throws NoSuchElementException {@inheritDoc}
550      */

551     public E getLast() {
552         E x = peekLast();
553         if (x == nullthrow new NoSuchElementException();
554         return x;
555     }
556
557     public E peekFirst() {
558         final ReentrantLock lock = this.lock;
559         lock.lock();
560         try {
561             return (first == null) ? null : first.item;
562         } finally {
563             lock.unlock();
564         }
565     }
566
567     public E peekLast() {
568         final ReentrantLock lock = this.lock;
569         lock.lock();
570         try {
571             return (last == null) ? null : last.item;
572         } finally {
573             lock.unlock();
574         }
575     }
576
577     public boolean removeFirstOccurrence(Object o) {
578         if (o == nullreturn false;
579         final ReentrantLock lock = this.lock;
580         lock.lock();
581         try {
582             for (Node<E> p = first; p != null; p = p.next) {
583                 if (o.equals(p.item)) {
584                     unlink(p);
585                     return true;
586                 }
587             }
588             return false;
589         } finally {
590             lock.unlock();
591         }
592     }
593
594     public boolean removeLastOccurrence(Object o) {
595         if (o == nullreturn false;
596         final ReentrantLock lock = this.lock;
597         lock.lock();
598         try {
599             for (Node<E> p = last; p != null; p = p.prev) {
600                 if (o.equals(p.item)) {
601                     unlink(p);
602                     return true;
603                 }
604             }
605             return false;
606         } finally {
607             lock.unlock();
608         }
609     }
610
611     // BlockingQueue methods
612
613     /**
614      * Inserts the specified element at the end of this deque unless it would
615      * violate capacity restrictions.  When using a capacity-restricted deque,
616      * it is generally preferable to use method {@link #offer(Object) offer}.
617      *
618      * <p>This method is equivalent to {@link #addLast}.
619      *
620      * @throws IllegalStateException if this deque is full
621      * @throws NullPointerException if the specified element is null
622      */

623     public boolean add(E e) {
624         addLast(e);
625         return true;
626     }
627
628     /**
629      * @throws NullPointerException if the specified element is null
630      */

631     public boolean offer(E e) {
632         return offerLast(e);
633     }
634
635     /**
636      * @throws NullPointerException {@inheritDoc}
637      * @throws InterruptedException {@inheritDoc}
638      */

639     public void put(E e) throws InterruptedException {
640         putLast(e);
641     }
642
643     /**
644      * @throws NullPointerException {@inheritDoc}
645      * @throws InterruptedException {@inheritDoc}
646      */

647     public boolean offer(E e, long timeout, TimeUnit unit)
648         throws InterruptedException {
649         return offerLast(e, timeout, unit);
650     }
651
652     /**
653      * Retrieves and removes the head of the queue represented by this deque.
654      * This method differs from {@link #poll() poll()} only in that it throws an
655      * exception if this deque is empty.
656      *
657      * <p>This method is equivalent to {@link #removeFirst() removeFirst}.
658      *
659      * @return the head of the queue represented by this deque
660      * @throws NoSuchElementException if this deque is empty
661      */

662     public E remove() {
663         return removeFirst();
664     }
665
666     public E poll() {
667         return pollFirst();
668     }
669
670     public E take() throws InterruptedException {
671         return takeFirst();
672     }
673
674     public E poll(long timeout, TimeUnit unit) throws InterruptedException {
675         return pollFirst(timeout, unit);
676     }
677
678     /**
679      * Retrieves, but does not remove, the head of the queue represented by
680      * this deque.  This method differs from {@link #peek() peek()} only in that
681      * it throws an exception if this deque is empty.
682      *
683      * <p>This method is equivalent to {@link #getFirst() getFirst}.
684      *
685      * @return the head of the queue represented by this deque
686      * @throws NoSuchElementException if this deque is empty
687      */

688     public E element() {
689         return getFirst();
690     }
691
692     public E peek() {
693         return peekFirst();
694     }
695
696     /**
697      * Returns the number of additional elements that this deque can ideally
698      * (in the absence of memory or resource constraints) accept without
699      * blocking. This is always equal to the initial capacity of this deque
700      * less the current {@code size} of this deque.
701      *
702      * <p>Note that you <em>cannot</em> always tell if an attempt to insert
703      * an element will succeed by inspecting {@code remainingCapacity}
704      * because it may be the case that another thread is about to
705      * insert or remove an element.
706      */

707     public int remainingCapacity() {
708         final ReentrantLock lock = this.lock;
709         lock.lock();
710         try {
711             return capacity - count;
712         } finally {
713             lock.unlock();
714         }
715     }
716
717     /**
718      * @throws UnsupportedOperationException {@inheritDoc}
719      * @throws ClassCastException            {@inheritDoc}
720      * @throws NullPointerException          {@inheritDoc}
721      * @throws IllegalArgumentException      {@inheritDoc}
722      */

723     public int drainTo(Collection<? super E> c) {
724         return drainTo(c, Integer.MAX_VALUE);
725     }
726
727     /**
728      * @throws UnsupportedOperationException {@inheritDoc}
729      * @throws ClassCastException            {@inheritDoc}
730      * @throws NullPointerException          {@inheritDoc}
731      * @throws IllegalArgumentException      {@inheritDoc}
732      */

733     public int drainTo(Collection<? super E> c, int maxElements) {
734         Objects.requireNonNull(c);
735         if (c == this)
736             throw new IllegalArgumentException();
737         if (maxElements <= 0)
738             return 0;
739         final ReentrantLock lock = this.lock;
740         lock.lock();
741         try {
742             int n = Math.min(maxElements, count);
743             for (int i = 0; i < n; i++) {
744                 c.add(first.item);   // In this order, in case add() throws.
745                 unlinkFirst();
746             }
747             return n;
748         } finally {
749             lock.unlock();
750         }
751     }
752
753     // Stack methods
754
755     /**
756      * @throws IllegalStateException if this deque is full
757      * @throws NullPointerException {@inheritDoc}
758      */

759     public void push(E e) {
760         addFirst(e);
761     }
762
763     /**
764      * @throws NoSuchElementException {@inheritDoc}
765      */

766     public E pop() {
767         return removeFirst();
768     }
769
770     // Collection methods
771
772     /**
773      * Removes the first occurrence of the specified element from this deque.
774      * If the deque does not contain the element, it is unchanged.
775      * More formally, removes the first element {@code e} such that
776      * {@code o.equals(e)} (if such an element exists).
777      * Returns {@code trueif this deque contained the specified element
778      * (or equivalently, if this deque changed as a result of the call).
779      *
780      * <p>This method is equivalent to
781      * {@link #removeFirstOccurrence(Object) removeFirstOccurrence}.
782      *
783      * @param o element to be removed from this deque, if present
784      * @return {@code trueif this deque changed as a result of the call
785      */

786     public boolean remove(Object o) {
787         return removeFirstOccurrence(o);
788     }
789
790     /**
791      * Returns the number of elements in this deque.
792      *
793      * @return the number of elements in this deque
794      */

795     public int size() {
796         final ReentrantLock lock = this.lock;
797         lock.lock();
798         try {
799             return count;
800         } finally {
801             lock.unlock();
802         }
803     }
804
805     /**
806      * Returns {@code trueif this deque contains the specified element.
807      * More formally, returns {@code trueif and only if this deque contains
808      * at least one element {@code e} such that {@code o.equals(e)}.
809      *
810      * @param o object to be checked for containment in this deque
811      * @return {@code trueif this deque contains the specified element
812      */

813     public boolean contains(Object o) {
814         if (o == nullreturn false;
815         final ReentrantLock lock = this.lock;
816         lock.lock();
817         try {
818             for (Node<E> p = first; p != null; p = p.next)
819                 if (o.equals(p.item))
820                     return true;
821             return false;
822         } finally {
823             lock.unlock();
824         }
825     }
826
827     /**
828      * Appends all of the elements in the specified collection to the end of
829      * this deque, in the order that they are returned by the specified
830      * collection's iterator.  Attempts to {@code addAll} of a deque to
831      * itself result in {@code IllegalArgumentException}.
832      *
833      * @param c the elements to be inserted into this deque
834      * @return {@code trueif this deque changed as a result of the call
835      * @throws NullPointerException if the specified collection or any
836      *         of its elements are null
837      * @throws IllegalArgumentException if the collection is this deque
838      * @throws IllegalStateException if this deque is full
839      * @see #add(Object)
840      */

841     public boolean addAll(Collection<? extends E> c) {
842         if (c == this)
843             // As historically specified in AbstractQueue#addAll
844             throw new IllegalArgumentException();
845
846         // Copy c into a private chain of Nodes
847         Node<E> beg = null, end = null;
848         int n = 0;
849         for (E e : c) {
850             Objects.requireNonNull(e);
851             n++;
852             Node<E> newNode = new Node<E>(e);
853             if (beg == null)
854                 beg = end = newNode;
855             else {
856                 end.next = newNode;
857                 newNode.prev = end;
858                 end = newNode;
859             }
860         }
861         if (beg == null)
862             return false;
863
864         // Atomically append the chain at the end
865         final ReentrantLock lock = this.lock;
866         lock.lock();
867         try {
868             if (count + n <= capacity) {
869                 beg.prev = last;
870                 if (first == null)
871                     first = beg;
872                 else
873                     last.next = beg;
874                 last = end;
875                 count += n;
876                 notEmpty.signalAll();
877                 return true;
878             }
879         } finally {
880             lock.unlock();
881         }
882         // Fall back to historic non-atomic implementation, failing
883         // with IllegalStateException when the capacity is exceeded.
884         return super.addAll(c);
885     }
886
887     /**
888      * Returns an array containing all of the elements in this deque, in
889      * proper sequence (from first to last element).
890      *
891      * <p>The returned array will be "safe" in that no references to it are
892      * maintained by this deque.  (In other words, this method must allocate
893      * a new array).  The caller is thus free to modify the returned array.
894      *
895      * <p>This method acts as bridge between array-based and collection-based
896      * APIs.
897      *
898      * @return an array containing all of the elements in this deque
899      */

900     @SuppressWarnings("unchecked")
901     public Object[] toArray() {
902         final ReentrantLock lock = this.lock;
903         lock.lock();
904         try {
905             Object[] a = new Object[count];
906             int k = 0;
907             for (Node<E> p = first; p != null; p = p.next)
908                 a[k++] = p.item;
909             return a;
910         } finally {
911             lock.unlock();
912         }
913     }
914
915     /**
916      * Returns an array containing all of the elements in this deque, in
917      * proper sequence; the runtime type of the returned array is that of
918      * the specified array.  If the deque fits in the specified array, it
919      * is returned therein.  Otherwise, a new array is allocated with the
920      * runtime type of the specified array and the size of this deque.
921      *
922      * <p>If this deque fits in the specified array with room to spare
923      * (i.e., the array has more elements than this deque), the element in
924      * the array immediately following the end of the deque is set to
925      * {@code null}.
926      *
927      * <p>Like the {@link #toArray()} method, this method acts as bridge between
928      * array-based and collection-based APIs.  Further, this method allows
929      * precise control over the runtime type of the output array, and may,
930      * under certain circumstances, be used to save allocation costs.
931      *
932      * <p>Suppose {@code x} is a deque known to contain only strings.
933      * The following code can be used to dump the deque into a newly
934      * allocated array of {@code String}:
935      *
936      * <pre> {@code String[] y = x.toArray(new String[0]);}</pre>
937      *
938      * Note that {@code toArray(new Object[0])} is identical in function to
939      * {@code toArray()}.
940      *
941      * @param a the array into which the elements of the deque are to
942      *          be stored, if it is big enough; otherwise, a new array of the
943      *          same runtime type is allocated for this purpose
944      * @return an array containing all of the elements in this deque
945      * @throws ArrayStoreException if the runtime type of the specified array
946      *         is not a supertype of the runtime type of every element in
947      *         this deque
948      * @throws NullPointerException if the specified array is null
949      */

950     @SuppressWarnings("unchecked")
951     public <T> T[] toArray(T[] a) {
952         final ReentrantLock lock = this.lock;
953         lock.lock();
954         try {
955             if (a.length < count)
956                 a = (T[])java.lang.reflect.Array.newInstance
957                     (a.getClass().getComponentType(), count);
958
959             int k = 0;
960             for (Node<E> p = first; p != null; p = p.next)
961                 a[k++] = (T)p.item;
962             if (a.length > k)
963                 a[k] = null;
964             return a;
965         } finally {
966             lock.unlock();
967         }
968     }
969
970     public String toString() {
971         return Helpers.collectionToString(this);
972     }
973
974     /**
975      * Atomically removes all of the elements from this deque.
976      * The deque will be empty after this call returns.
977      */

978     public void clear() {
979         final ReentrantLock lock = this.lock;
980         lock.lock();
981         try {
982             for (Node<E> f = first; f != null; ) {
983                 f.item = null;
984                 Node<E> n = f.next;
985                 f.prev = null;
986                 f.next = null;
987                 f = n;
988             }
989             first = last = null;
990             count = 0;
991             notFull.signalAll();
992         } finally {
993             lock.unlock();
994         }
995     }
996
997     /**
998      * Used for any element traversal that is not entirely under lock.
999      * Such traversals must handle both:
1000      * - dequeued nodes (p.next == p)
1001      * - (possibly multiple) interior removed nodes (p.item == null)
1002      */

1003     Node<E> succ(Node<E> p) {
1004         if (p == (p = p.next))
1005             p = first;
1006         return p;
1007     }
1008
1009     /**
1010      * Returns an iterator over the elements in this deque in proper sequence.
1011      * The elements will be returned in order from first (head) to last (tail).
1012      *
1013      * <p>The returned iterator is
1014      * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
1015      *
1016      * @return an iterator over the elements in this deque in proper sequence
1017      */

1018     public Iterator<E> iterator() {
1019         return new Itr();
1020     }
1021
1022     /**
1023      * Returns an iterator over the elements in this deque in reverse
1024      * sequential order.  The elements will be returned in order from
1025      * last (tail) to first (head).
1026      *
1027      * <p>The returned iterator is
1028      * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
1029      *
1030      * @return an iterator over the elements in this deque in reverse order
1031      */

1032     public Iterator<E> descendingIterator() {
1033         return new DescendingItr();
1034     }
1035
1036     /**
1037      * Base class for LinkedBlockingDeque iterators.
1038      */

1039     private abstract class AbstractItr implements Iterator<E> {
1040         /**
1041          * The next node to return in next().
1042          */

1043         Node<E> next;
1044
1045         /**
1046          * nextItem holds on to item fields because once we claim that
1047          * an element exists in hasNext(), we must return item read
1048          * under lock even if it was in the process of being removed
1049          * when hasNext() was called.
1050          */

1051         E nextItem;
1052
1053         /**
1054          * Node returned by most recent call to next. Needed by remove.
1055          * Reset to null if this element is deleted by a call to remove.
1056          */

1057         private Node<E> lastRet;
1058
1059         abstract Node<E> firstNode();
1060         abstract Node<E> nextNode(Node<E> n);
1061
1062         private Node<E> succ(Node<E> p) {
1063             if (p == (p = nextNode(p)))
1064                 p = firstNode();
1065             return p;
1066         }
1067
1068         AbstractItr() {
1069             // set to initial position
1070             final ReentrantLock lock = LinkedBlockingDeque.this.lock;
1071             lock.lock();
1072             try {
1073                 if ((next = firstNode()) != null)
1074                     nextItem = next.item;
1075             } finally {
1076                 lock.unlock();
1077             }
1078         }
1079
1080         public boolean hasNext() {
1081             return next != null;
1082         }
1083
1084         public E next() {
1085             Node<E> p;
1086             if ((p = next) == null)
1087                 throw new NoSuchElementException();
1088             lastRet = p;
1089             E x = nextItem;
1090             final ReentrantLock lock = LinkedBlockingDeque.this.lock;
1091             lock.lock();
1092             try {
1093                 E e = null;
1094                 for (p = nextNode(p); p != null && (e = p.item) == null; )
1095                     p = succ(p);
1096                 next = p;
1097                 nextItem = e;
1098             } finally {
1099                 lock.unlock();
1100             }
1101             return x;
1102         }
1103
1104         public void forEachRemaining(Consumer<? super E> action) {
1105             // A variant of forEachFrom
1106             Objects.requireNonNull(action);
1107             Node<E> p;
1108             if ((p = next) == nullreturn;
1109             lastRet = p;
1110             next = null;
1111             final ReentrantLock lock = LinkedBlockingDeque.this.lock;
1112             final int batchSize = 64;
1113             Object[] es = null;
1114             int n, len = 1;
1115             do {
1116                 lock.lock();
1117                 try {
1118                     if (es == null) {
1119                         p = nextNode(p);
1120                         for (Node<E> q = p; q != null; q = succ(q))
1121                             if (q.item != null && ++len == batchSize)
1122                                 break;
1123                         es = new Object[len];
1124                         es[0] = nextItem;
1125                         nextItem = null;
1126                         n = 1;
1127                     } else
1128                         n = 0;
1129                     for (; p != null && n < len; p = succ(p))
1130                         if ((es[n] = p.item) != null) {
1131                             lastRet = p;
1132                             n++;
1133                         }
1134                 } finally {
1135                     lock.unlock();
1136                 }
1137                 for (int i = 0; i < n; i++) {
1138                     @SuppressWarnings("unchecked") E e = (E) es[i];
1139                     action.accept(e);
1140                 }
1141             } while (n > 0 && p != null);
1142         }
1143
1144         public void remove() {
1145             Node<E> n = lastRet;
1146             if (n == null)
1147                 throw new IllegalStateException();
1148             lastRet = null;
1149             final ReentrantLock lock = LinkedBlockingDeque.this.lock;
1150             lock.lock();
1151             try {
1152                 if (n.item != null)
1153                     unlink(n);
1154             } finally {
1155                 lock.unlock();
1156             }
1157         }
1158     }
1159
1160     /** Forward iterator */
1161     private class Itr extends AbstractItr {
1162         Itr() {}                        // prevent access constructor creation
1163         Node<E> firstNode() { return first; }
1164         Node<E> nextNode(Node<E> n) { return n.next; }
1165     }
1166
1167     /** Descending iterator */
1168     private class DescendingItr extends AbstractItr {
1169         DescendingItr() {}              // prevent access constructor creation
1170         Node<E> firstNode() { return last; }
1171         Node<E> nextNode(Node<E> n) { return n.prev; }
1172     }
1173
1174     /**
1175      * A customized variant of Spliterators.IteratorSpliterator.
1176      * Keep this class in sync with (very similar) LBQSpliterator.
1177      */

1178     private final class LBDSpliterator implements Spliterator<E> {
1179         static final int MAX_BATCH = 1 << 25;  // max batch array size;
1180         Node<E> current;    // current node; null until initialized
1181         int batch;          // batch size for splits
1182         boolean exhausted;  // true when no more nodes
1183         long est = size();  // size estimate
1184
1185         LBDSpliterator() {}
1186
1187         public long estimateSize() { return est; }
1188
1189         public Spliterator<E> trySplit() {
1190             Node<E> h;
1191             if (!exhausted &&
1192                 ((h = current) != null || (h = first) != null)
1193                 && h.next != null) {
1194                 int n = batch = Math.min(batch + 1, MAX_BATCH);
1195                 Object[] a = new Object[n];
1196                 final ReentrantLock lock = LinkedBlockingDeque.this.lock;
1197                 int i = 0;
1198                 Node<E> p = current;
1199                 lock.lock();
1200                 try {
1201                     if (p != null || (p = first) != null)
1202                         for (; p != null && i < n; p = succ(p))
1203                             if ((a[i] = p.item) != null)
1204                                 i++;
1205                 } finally {
1206                     lock.unlock();
1207                 }
1208                 if ((current = p) == null) {
1209                     est = 0L;
1210                     exhausted = true;
1211                 }
1212                 else if ((est -= i) < 0L)
1213                     est = 0L;
1214                 if (i > 0)
1215                     return Spliterators.spliterator
1216                         (a, 0, i, (Spliterator.ORDERED |
1217                                    Spliterator.NONNULL |
1218                                    Spliterator.CONCURRENT));
1219             }
1220             return null;
1221         }
1222
1223         public boolean tryAdvance(Consumer<? super E> action) {
1224             Objects.requireNonNull(action);
1225             if (!exhausted) {
1226                 E e = null;
1227                 final ReentrantLock lock = LinkedBlockingDeque.this.lock;
1228                 lock.lock();
1229                 try {
1230                     Node<E> p;
1231                     if ((p = current) != null || (p = first) != null)
1232                         do {
1233                             e = p.item;
1234                             p = succ(p);
1235                         } while (e == null && p != null);
1236                     if ((current = p) == null)
1237                         exhausted = true;
1238                 } finally {
1239                     lock.unlock();
1240                 }
1241                 if (e != null) {
1242                     action.accept(e);
1243                     return true;
1244                 }
1245             }
1246             return false;
1247         }
1248
1249         public void forEachRemaining(Consumer<? super E> action) {
1250             Objects.requireNonNull(action);
1251             if (!exhausted) {
1252                 exhausted = true;
1253                 Node<E> p = current;
1254                 current = null;
1255                 forEachFrom(action, p);
1256             }
1257         }
1258
1259         public int characteristics() {
1260             return (Spliterator.ORDERED |
1261                     Spliterator.NONNULL |
1262                     Spliterator.CONCURRENT);
1263         }
1264     }
1265
1266     /**
1267      * Returns a {@link Spliterator} over the elements in this deque.
1268      *
1269      * <p>The returned spliterator is
1270      * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>.
1271      *
1272      * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT},
1273      * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}.
1274      *
1275      * @implNote
1276      * The {@code Spliterator} implements {@code trySplit} to permit limited
1277      * parallelism.
1278      *
1279      * @return a {@code Spliterator} over the elements in this deque
1280      * @since 1.8
1281      */

1282     public Spliterator<E> spliterator() {
1283         return new LBDSpliterator();
1284     }
1285
1286     /**
1287      * @throws NullPointerException {@inheritDoc}
1288      */

1289     public void forEach(Consumer<? super E> action) {
1290         Objects.requireNonNull(action);
1291         forEachFrom(action, null);
1292     }
1293
1294     /**
1295      * Runs action on each element found during a traversal starting at p.
1296      * If p is null, traversal starts at head.
1297      */

1298     void forEachFrom(Consumer<? super E> action, Node<E> p) {
1299         // Extract batches of elements while holding the lock; then
1300         // run the action on the elements while not
1301         final ReentrantLock lock = this.lock;
1302         final int batchSize = 64;       // max number of elements per batch
1303         Object[] es = null;             // container for batch of elements
1304         int n, len = 0;
1305         do {
1306             lock.lock();
1307             try {
1308                 if (es == null) {
1309                     if (p == null) p = first;
1310                     for (Node<E> q = p; q != null; q = succ(q))
1311                         if (q.item != null && ++len == batchSize)
1312                             break;
1313                     es = new Object[len];
1314                 }
1315                 for (n = 0; p != null && n < len; p = succ(p))
1316                     if ((es[n] = p.item) != null)
1317                         n++;
1318             } finally {
1319                 lock.unlock();
1320             }
1321             for (int i = 0; i < n; i++) {
1322                 @SuppressWarnings("unchecked") E e = (E) es[i];
1323                 action.accept(e);
1324             }
1325         } while (n > 0 && p != null);
1326     }
1327
1328     /**
1329      * @throws NullPointerException {@inheritDoc}
1330      */

1331     public boolean removeIf(Predicate<? super E> filter) {
1332         Objects.requireNonNull(filter);
1333         return bulkRemove(filter);
1334     }
1335
1336     /**
1337      * @throws NullPointerException {@inheritDoc}
1338      */

1339     public boolean removeAll(Collection<?> c) {
1340         Objects.requireNonNull(c);
1341         return bulkRemove(e -> c.contains(e));
1342     }
1343
1344     /**
1345      * @throws NullPointerException {@inheritDoc}
1346      */

1347     public boolean retainAll(Collection<?> c) {
1348         Objects.requireNonNull(c);
1349         return bulkRemove(e -> !c.contains(e));
1350     }
1351
1352     /** Implementation of bulk remove methods. */
1353     @SuppressWarnings("unchecked")
1354     private boolean bulkRemove(Predicate<? super E> filter) {
1355         boolean removed = false;
1356         final ReentrantLock lock = this.lock;
1357         Node<E> p = null;
1358         Node<E>[] nodes = null;
1359         int n, len = 0;
1360         do {
1361             // 1. Extract batch of up to 64 elements while holding the lock.
1362             lock.lock();
1363             try {
1364                 if (nodes == null) {  // first batch; initialize
1365                     p = first;
1366                     for (Node<E> q = p; q != null; q = succ(q))
1367                         if (q.item != null && ++len == 64)
1368                             break;
1369                     nodes = (Node<E>[]) new Node<?>[len];
1370                 }
1371                 for (n = 0; p != null && n < len; p = succ(p))
1372                     nodes[n++] = p;
1373             } finally {
1374                 lock.unlock();
1375             }
1376
1377             // 2. Run the filter on the elements while lock is free.
1378             long deathRow = 0L;       // "bitset" of size 64
1379             for (int i = 0; i < n; i++) {
1380                 final E e;
1381                 if ((e = nodes[i].item) != null && filter.test(e))
1382                     deathRow |= 1L << i;
1383             }
1384
1385             // 3. Remove any filtered elements while holding the lock.
1386             if (deathRow != 0) {
1387                 lock.lock();
1388                 try {
1389                     for (int i = 0; i < n; i++) {
1390                         final Node<E> q;
1391                         if ((deathRow & (1L << i)) != 0L
1392                             && (q = nodes[i]).item != null) {
1393                             unlink(q);
1394                             removed = true;
1395                         }
1396                         nodes[i] = null// help GC
1397                     }
1398                 } finally {
1399                     lock.unlock();
1400                 }
1401             }
1402         } while (n > 0 && p != null);
1403         return removed;
1404     }
1405
1406     /**
1407      * Saves this deque to a stream (that is, serializes it).
1408      *
1409      * @param s the stream
1410      * @throws java.io.IOException if an I/O error occurs
1411      * @serialData The capacity (int), followed by elements (each an
1412      * {@code Object}) in the proper order, followed by a null
1413      */

1414     private void writeObject(java.io.ObjectOutputStream s)
1415         throws java.io.IOException {
1416         final ReentrantLock lock = this.lock;
1417         lock.lock();
1418         try {
1419             // Write out capacity and any hidden stuff
1420             s.defaultWriteObject();
1421             // Write out all elements in the proper order.
1422             for (Node<E> p = first; p != null; p = p.next)
1423                 s.writeObject(p.item);
1424             // Use trailing null as sentinel
1425             s.writeObject(null);
1426         } finally {
1427             lock.unlock();
1428         }
1429     }
1430
1431     /**
1432      * Reconstitutes this deque from a stream (that is, deserializes it).
1433      * @param s the stream
1434      * @throws ClassNotFoundException if the class of a serialized object
1435      *         could not be found
1436      * @throws java.io.IOException if an I/O error occurs
1437      */

1438     private void readObject(java.io.ObjectInputStream s)
1439         throws java.io.IOException, ClassNotFoundException {
1440         s.defaultReadObject();
1441         count = 0;
1442         first = null;
1443         last = null;
1444         // Read in all elements and place in queue
1445         for (;;) {
1446             @SuppressWarnings("unchecked") E item = (E)s.readObject();
1447             if (item == null)
1448                 break;
1449             add(item);
1450         }
1451     }
1452
1453     void checkInvariants() {
1454         // assert lock.isHeldByCurrentThread();
1455         // Nodes may get self-linked or lose their item, but only
1456         // after being unlinked and becoming unreachable from first.
1457         for (Node<E> p = first; p != null; p = p.next) {
1458             // assert p.next != p;
1459             // assert p.item != null;
1460         }
1461     }
1462
1463 }
1464