blob: 2b0f36c523d1c9b9288ef1af0d684eb45dbb062c [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
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. Sun designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 * CA 95054 USA or visit www.sun.com if you need additional information or
22 * have any 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/licenses/publicdomain
34 */
35
36package java.util.concurrent.locks;
37import java.util.*;
38import java.util.concurrent.*;
39import java.util.concurrent.atomic.*;
40import sun.misc.Unsafe;
41
42/**
43 * A version of {@link AbstractQueuedSynchronizer} in
44 * which synchronization state is maintained as a <tt>long</tt>.
45 * This class has exactly the same structure, properties, and methods
46 * as <tt>AbstractQueuedSynchronizer</tt> with the exception
47 * that all state-related parameters and results are defined
48 * as <tt>long</tt> rather than <tt>int</tt>. This class
49 * may be useful when creating synchronizers such as
50 * multilevel locks and barriers that require
51 * 64 bits of state.
52 *
53 * <p>See {@link AbstractQueuedSynchronizer} for usage
54 * notes and examples.
55 *
56 * @since 1.6
57 * @author Doug Lea
58 */
59public abstract class AbstractQueuedLongSynchronizer
60 extends AbstractOwnableSynchronizer
61 implements java.io.Serializable {
62
63 private static final long serialVersionUID = 7373984972572414692L;
64
65 /*
66 To keep sources in sync, the remainder of this source file is
67 exactly cloned from AbstractQueuedSynchronizer, replacing class
68 name and changing ints related with sync state to longs. Please
69 keep it that way.
70 */
71
72 /**
73 * Creates a new <tt>AbstractQueuedLongSynchronizer</tt> instance
74 * with initial synchronization state of zero.
75 */
76 protected AbstractQueuedLongSynchronizer() { }
77
78 /**
79 * Wait queue node class.
80 *
81 * <p>The wait queue is a variant of a "CLH" (Craig, Landin, and
82 * Hagersten) lock queue. CLH locks are normally used for
83 * spinlocks. We instead use them for blocking synchronizers, but
84 * use the same basic tactic of holding some of the control
85 * information about a thread in the predecessor of its node. A
86 * "status" field in each node keeps track of whether a thread
87 * should block. A node is signalled when its predecessor
88 * releases. Each node of the queue otherwise serves as a
89 * specific-notification-style monitor holding a single waiting
90 * thread. The status field does NOT control whether threads are
91 * granted locks etc though. A thread may try to acquire if it is
92 * first in the queue. But being first does not guarantee success;
93 * it only gives the right to contend. So the currently released
94 * contender thread may need to rewait.
95 *
96 * <p>To enqueue into a CLH lock, you atomically splice it in as new
97 * tail. To dequeue, you just set the head field.
98 * <pre>
99 * +------+ prev +-----+ +-----+
100 * head | | <---- | | <---- | | tail
101 * +------+ +-----+ +-----+
102 * </pre>
103 *
104 * <p>Insertion into a CLH queue requires only a single atomic
105 * operation on "tail", so there is a simple atomic point of
106 * demarcation from unqueued to queued. Similarly, dequeing
107 * involves only updating the "head". However, it takes a bit
108 * more work for nodes to determine who their successors are,
109 * in part to deal with possible cancellation due to timeouts
110 * and interrupts.
111 *
112 * <p>The "prev" links (not used in original CLH locks), are mainly
113 * needed to handle cancellation. If a node is cancelled, its
114 * successor is (normally) relinked to a non-cancelled
115 * predecessor. For explanation of similar mechanics in the case
116 * of spin locks, see the papers by Scott and Scherer at
117 * http://www.cs.rochester.edu/u/scott/synchronization/
118 *
119 * <p>We also use "next" links to implement blocking mechanics.
120 * The thread id for each node is kept in its own node, so a
121 * predecessor signals the next node to wake up by traversing
122 * next link to determine which thread it is. Determination of
123 * successor must avoid races with newly queued nodes to set
124 * the "next" fields of their predecessors. This is solved
125 * when necessary by checking backwards from the atomically
126 * updated "tail" when a node's successor appears to be null.
127 * (Or, said differently, the next-links are an optimization
128 * so that we don't usually need a backward scan.)
129 *
130 * <p>Cancellation introduces some conservatism to the basic
131 * algorithms. Since we must poll for cancellation of other
132 * nodes, we can miss noticing whether a cancelled node is
133 * ahead or behind us. This is dealt with by always unparking
134 * successors upon cancellation, allowing them to stabilize on
135 * a new predecessor, unless we can identify an uncancelled
136 * predecessor who will carry this responsibility.
137 *
138 * <p>CLH queues need a dummy header node to get started. But
139 * we don't create them on construction, because it would be wasted
140 * effort if there is never contention. Instead, the node
141 * is constructed and head and tail pointers are set upon first
142 * contention.
143 *
144 * <p>Threads waiting on Conditions use the same nodes, but
145 * use an additional link. Conditions only need to link nodes
146 * in simple (non-concurrent) linked queues because they are
147 * only accessed when exclusively held. Upon await, a node is
148 * inserted into a condition queue. Upon signal, the node is
149 * transferred to the main queue. A special value of status
150 * field is used to mark which queue a node is on.
151 *
152 * <p>Thanks go to Dave Dice, Mark Moir, Victor Luchangco, Bill
153 * Scherer and Michael Scott, along with members of JSR-166
154 * expert group, for helpful ideas, discussions, and critiques
155 * on the design of this class.
156 */
157 static final class Node {
158 /** Marker to indicate a node is waiting in shared mode */
159 static final Node SHARED = new Node();
160 /** Marker to indicate a node is waiting in exclusive mode */
161 static final Node EXCLUSIVE = null;
162
163 /** waitStatus value to indicate thread has cancelled */
164 static final int CANCELLED = 1;
165 /** waitStatus value to indicate successor's thread needs unparking */
166 static final int SIGNAL = -1;
167 /** waitStatus value to indicate thread is waiting on condition */
168 static final int CONDITION = -2;
169
170 /**
171 * Status field, taking on only the values:
172 * SIGNAL: The successor of this node is (or will soon be)
173 * blocked (via park), so the current node must
174 * unpark its successor when it releases or
175 * cancels. To avoid races, acquire methods must
176 * first indicate they need a signal,
177 * then retry the atomic acquire, and then,
178 * on failure, block.
179 * CANCELLED: This node is cancelled due to timeout or interrupt.
180 * Nodes never leave this state. In particular,
181 * a thread with cancelled node never again blocks.
182 * CONDITION: This node is currently on a condition queue.
183 * It will not be used as a sync queue node until
184 * transferred. (Use of this value here
185 * has nothing to do with the other uses
186 * of the field, but simplifies mechanics.)
187 * 0: None of the above
188 *
189 * The values are arranged numerically to simplify use.
190 * Non-negative values mean that a node doesn't need to
191 * signal. So, most code doesn't need to check for particular
192 * values, just for sign.
193 *
194 * The field is initialized to 0 for normal sync nodes, and
195 * CONDITION for condition nodes. It is modified using CAS
196 * (or when possible, unconditional volatile writes).
197 */
198 volatile int waitStatus;
199
200 /**
201 * Link to predecessor node that current node/thread relies on
202 * for checking waitStatus. Assigned during enqueing, and nulled
203 * out (for sake of GC) only upon dequeuing. Also, upon
204 * cancellation of a predecessor, we short-circuit while
205 * finding a non-cancelled one, which will always exist
206 * because the head node is never cancelled: A node becomes
207 * head only as a result of successful acquire. A
208 * cancelled thread never succeeds in acquiring, and a thread only
209 * cancels itself, not any other node.
210 */
211 volatile Node prev;
212
213 /**
214 * Link to the successor node that the current node/thread
215 * unparks upon release. Assigned during enqueuing, adjusted
216 * when bypassing cancelled predecessors, and nulled out (for
217 * sake of GC) when dequeued. The enq operation does not
218 * assign next field of a predecessor until after attachment,
219 * so seeing a null next field does not necessarily mean that
220 * node is at end of queue. However, if a next field appears
221 * to be null, we can scan prev's from the tail to
222 * double-check. The next field of cancelled nodes is set to
223 * point to the node itself instead of null, to make life
224 * easier for isOnSyncQueue.
225 */
226 volatile Node next;
227
228 /**
229 * The thread that enqueued this node. Initialized on
230 * construction and nulled out after use.
231 */
232 volatile Thread thread;
233
234 /**
235 * Link to next node waiting on condition, or the special
236 * value SHARED. Because condition queues are accessed only
237 * when holding in exclusive mode, we just need a simple
238 * linked queue to hold nodes while they are waiting on
239 * conditions. They are then transferred to the queue to
240 * re-acquire. And because conditions can only be exclusive,
241 * we save a field by using special value to indicate shared
242 * mode.
243 */
244 Node nextWaiter;
245
246 /**
247 * Returns true if node is waiting in shared mode
248 */
249 final boolean isShared() {
250 return nextWaiter == SHARED;
251 }
252
253 /**
254 * Returns previous node, or throws NullPointerException if null.
255 * Use when predecessor cannot be null. The null check could
256 * be elided, but is present to help the VM.
257 *
258 * @return the predecessor of this node
259 */
260 final Node predecessor() throws NullPointerException {
261 Node p = prev;
262 if (p == null)
263 throw new NullPointerException();
264 else
265 return p;
266 }
267
268 Node() { // Used to establish initial head or SHARED marker
269 }
270
271 Node(Thread thread, Node mode) { // Used by addWaiter
272 this.nextWaiter = mode;
273 this.thread = thread;
274 }
275
276 Node(Thread thread, int waitStatus) { // Used by Condition
277 this.waitStatus = waitStatus;
278 this.thread = thread;
279 }
280 }
281
282 /**
283 * Head of the wait queue, lazily initialized. Except for
284 * initialization, it is modified only via method setHead. Note:
285 * If head exists, its waitStatus is guaranteed not to be
286 * CANCELLED.
287 */
288 private transient volatile Node head;
289
290 /**
291 * Tail of the wait queue, lazily initialized. Modified only via
292 * method enq to add new wait node.
293 */
294 private transient volatile Node tail;
295
296 /**
297 * The synchronization state.
298 */
299 private volatile long state;
300
301 /**
302 * Returns the current value of synchronization state.
303 * This operation has memory semantics of a <tt>volatile</tt> read.
304 * @return current state value
305 */
306 protected final long getState() {
307 return state;
308 }
309
310 /**
311 * Sets the value of synchronization state.
312 * This operation has memory semantics of a <tt>volatile</tt> write.
313 * @param newState the new state value
314 */
315 protected final void setState(long newState) {
316 state = newState;
317 }
318
319 /**
320 * Atomically sets synchronization state to the given updated
321 * value if the current state value equals the expected value.
322 * This operation has memory semantics of a <tt>volatile</tt> read
323 * and write.
324 *
325 * @param expect the expected value
326 * @param update the new value
327 * @return true if successful. False return indicates that the actual
328 * value was not equal to the expected value.
329 */
330 protected final boolean compareAndSetState(long expect, long update) {
331 // See below for intrinsics setup to support this
332 return unsafe.compareAndSwapLong(this, stateOffset, expect, update);
333 }
334
335 // Queuing utilities
336
337 /**
338 * The number of nanoseconds for which it is faster to spin
339 * rather than to use timed park. A rough estimate suffices
340 * to improve responsiveness with very short timeouts.
341 */
342 static final long spinForTimeoutThreshold = 1000L;
343
344 /**
345 * Inserts node into queue, initializing if necessary. See picture above.
346 * @param node the node to insert
347 * @return node's predecessor
348 */
349 private Node enq(final Node node) {
350 for (;;) {
351 Node t = tail;
352 if (t == null) { // Must initialize
353 if (compareAndSetHead(new Node()))
354 tail = head;
355 } else {
356 node.prev = t;
357 if (compareAndSetTail(t, node)) {
358 t.next = node;
359 return t;
360 }
361 }
362 }
363 }
364
365 /**
366 * Creates and enqueues node for current thread and given mode.
367 *
368 * @param mode Node.EXCLUSIVE for exclusive, Node.SHARED for shared
369 * @return the new node
370 */
371 private Node addWaiter(Node mode) {
372 Node node = new Node(Thread.currentThread(), mode);
373 // Try the fast path of enq; backup to full enq on failure
374 Node pred = tail;
375 if (pred != null) {
376 node.prev = pred;
377 if (compareAndSetTail(pred, node)) {
378 pred.next = node;
379 return node;
380 }
381 }
382 enq(node);
383 return node;
384 }
385
386 /**
387 * Sets head of queue to be node, thus dequeuing. Called only by
388 * acquire methods. Also nulls out unused fields for sake of GC
389 * and to suppress unnecessary signals and traversals.
390 *
391 * @param node the node
392 */
393 private void setHead(Node node) {
394 head = node;
395 node.thread = null;
396 node.prev = null;
397 }
398
399 /**
400 * Wakes up node's successor, if one exists.
401 *
402 * @param node the node
403 */
404 private void unparkSuccessor(Node node) {
405 /*
406 * Try to clear status in anticipation of signalling. It is
407 * OK if this fails or if status is changed by waiting thread.
408 */
409 compareAndSetWaitStatus(node, Node.SIGNAL, 0);
410
411 /*
412 * Thread to unpark is held in successor, which is normally
413 * just the next node. But if cancelled or apparently null,
414 * traverse backwards from tail to find the actual
415 * non-cancelled successor.
416 */
417 Node s = node.next;
418 if (s == null || s.waitStatus > 0) {
419 s = null;
420 for (Node t = tail; t != null && t != node; t = t.prev)
421 if (t.waitStatus <= 0)
422 s = t;
423 }
424 if (s != null)
425 LockSupport.unpark(s.thread);
426 }
427
428 /**
429 * Sets head of queue, and checks if successor may be waiting
430 * in shared mode, if so propagating if propagate > 0.
431 *
432 * @param pred the node holding waitStatus for node
433 * @param node the node
434 * @param propagate the return value from a tryAcquireShared
435 */
436 private void setHeadAndPropagate(Node node, long propagate) {
437 setHead(node);
438 if (propagate > 0 && node.waitStatus != 0) {
439 /*
440 * Don't bother fully figuring out successor. If it
441 * looks null, call unparkSuccessor anyway to be safe.
442 */
443 Node s = node.next;
444 if (s == null || s.isShared())
445 unparkSuccessor(node);
446 }
447 }
448
449 // Utilities for various versions of acquire
450
451 /**
452 * Cancels an ongoing attempt to acquire.
453 *
454 * @param node the node
455 */
456 private void cancelAcquire(Node node) {
457 // Ignore if node doesn't exist
458 if (node == null)
459 return;
460
461 node.thread = null;
462
463 // Skip cancelled predecessors
464 Node pred = node.prev;
465 while (pred.waitStatus > 0)
466 node.prev = pred = pred.prev;
467
468 // Getting this before setting waitStatus ensures staleness
469 Node predNext = pred.next;
470
471 // Can use unconditional write instead of CAS here
472 node.waitStatus = Node.CANCELLED;
473
474 // If we are the tail, remove ourselves
475 if (node == tail && compareAndSetTail(node, pred)) {
476 compareAndSetNext(pred, predNext, null);
477 } else {
478 // If "active" predecessor found...
479 if (pred != head
480 && (pred.waitStatus == Node.SIGNAL
481 || compareAndSetWaitStatus(pred, 0, Node.SIGNAL))
482 && pred.thread != null) {
483
484 // If successor is active, set predecessor's next link
485 Node next = node.next;
486 if (next != null && next.waitStatus <= 0)
487 compareAndSetNext(pred, predNext, next);
488 } else {
489 unparkSuccessor(node);
490 }
491
492 node.next = node; // help GC
493 }
494 }
495
496 /**
497 * Checks and updates status for a node that failed to acquire.
498 * Returns true if thread should block. This is the main signal
499 * control in all acquire loops. Requires that pred == node.prev
500 *
501 * @param pred node's predecessor holding status
502 * @param node the node
503 * @return {@code true} if thread should block
504 */
505 private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
506 int s = pred.waitStatus;
507 if (s < 0)
508 /*
509 * This node has already set status asking a release
510 * to signal it, so it can safely park.
511 */
512 return true;
513 if (s > 0) {
514 /*
515 * Predecessor was cancelled. Skip over predecessors and
516 * indicate retry.
517 */
518 do {
519 node.prev = pred = pred.prev;
520 } while (pred.waitStatus > 0);
521 pred.next = node;
522 }
523 else
524 /*
525 * Indicate that we need a signal, but don't park yet. Caller
526 * will need to retry to make sure it cannot acquire before
527 * parking.
528 */
529 compareAndSetWaitStatus(pred, 0, Node.SIGNAL);
530 return false;
531 }
532
533 /**
534 * Convenience method to interrupt current thread.
535 */
536 private static void selfInterrupt() {
537 Thread.currentThread().interrupt();
538 }
539
540 /**
541 * Convenience method to park and then check if interrupted
542 *
543 * @return {@code true} if interrupted
544 */
545 private final boolean parkAndCheckInterrupt() {
546 LockSupport.park(this);
547 return Thread.interrupted();
548 }
549
550 /*
551 * Various flavors of acquire, varying in exclusive/shared and
552 * control modes. Each is mostly the same, but annoyingly
553 * different. Only a little bit of factoring is possible due to
554 * interactions of exception mechanics (including ensuring that we
555 * cancel if tryAcquire throws exception) and other control, at
556 * least not without hurting performance too much.
557 */
558
559 /**
560 * Acquires in exclusive uninterruptible mode for thread already in
561 * queue. Used by condition wait methods as well as acquire.
562 *
563 * @param node the node
564 * @param arg the acquire argument
565 * @return {@code true} if interrupted while waiting
566 */
567 final boolean acquireQueued(final Node node, long arg) {
568 boolean failed = true;
569 try {
570 boolean interrupted = false;
571 for (;;) {
572 final Node p = node.predecessor();
573 if (p == head && tryAcquire(arg)) {
574 setHead(node);
575 p.next = null; // help GC
576 failed = false;
577 return interrupted;
578 }
579 if (shouldParkAfterFailedAcquire(p, node) &&
580 parkAndCheckInterrupt())
581 interrupted = true;
582 }
583 } finally {
584 if (failed)
585 cancelAcquire(node);
586 }
587 }
588
589 /**
590 * Acquires in exclusive interruptible mode.
591 * @param arg the acquire argument
592 */
593 private void doAcquireInterruptibly(long arg)
594 throws InterruptedException {
595 final Node node = addWaiter(Node.EXCLUSIVE);
596 boolean failed = true;
597 try {
598 for (;;) {
599 final Node p = node.predecessor();
600 if (p == head && tryAcquire(arg)) {
601 setHead(node);
602 p.next = null; // help GC
603 failed = false;
604 return;
605 }
606 if (shouldParkAfterFailedAcquire(p, node) &&
607 parkAndCheckInterrupt())
608 throw new InterruptedException();
609 }
610 } finally {
611 if (failed)
612 cancelAcquire(node);
613 }
614 }
615
616 /**
617 * Acquires in exclusive timed mode.
618 *
619 * @param arg the acquire argument
620 * @param nanosTimeout max wait time
621 * @return {@code true} if acquired
622 */
623 private boolean doAcquireNanos(long arg, long nanosTimeout)
624 throws InterruptedException {
625 long lastTime = System.nanoTime();
626 final Node node = addWaiter(Node.EXCLUSIVE);
627 boolean failed = true;
628 try {
629 for (;;) {
630 final Node p = node.predecessor();
631 if (p == head && tryAcquire(arg)) {
632 setHead(node);
633 p.next = null; // help GC
634 failed = false;
635 return true;
636 }
637 if (nanosTimeout <= 0)
638 return false;
639 if (shouldParkAfterFailedAcquire(p, node) &&
640 nanosTimeout > spinForTimeoutThreshold)
641 LockSupport.parkNanos(this, nanosTimeout);
642 long now = System.nanoTime();
643 nanosTimeout -= now - lastTime;
644 lastTime = now;
645 if (Thread.interrupted())
646 throw new InterruptedException();
647 }
648 } finally {
649 if (failed)
650 cancelAcquire(node);
651 }
652 }
653
654 /**
655 * Acquires in shared uninterruptible mode.
656 * @param arg the acquire argument
657 */
658 private void doAcquireShared(long arg) {
659 final Node node = addWaiter(Node.SHARED);
660 boolean failed = true;
661 try {
662 boolean interrupted = false;
663 for (;;) {
664 final Node p = node.predecessor();
665 if (p == head) {
666 long r = tryAcquireShared(arg);
667 if (r >= 0) {
668 setHeadAndPropagate(node, r);
669 p.next = null; // help GC
670 if (interrupted)
671 selfInterrupt();
672 failed = false;
673 return;
674 }
675 }
676 if (shouldParkAfterFailedAcquire(p, node) &&
677 parkAndCheckInterrupt())
678 interrupted = true;
679 }
680 } finally {
681 if (failed)
682 cancelAcquire(node);
683 }
684 }
685
686 /**
687 * Acquires in shared interruptible mode.
688 * @param arg the acquire argument
689 */
690 private void doAcquireSharedInterruptibly(long arg)
691 throws InterruptedException {
692 final Node node = addWaiter(Node.SHARED);
693 boolean failed = true;
694 try {
695 for (;;) {
696 final Node p = node.predecessor();
697 if (p == head) {
698 long r = tryAcquireShared(arg);
699 if (r >= 0) {
700 setHeadAndPropagate(node, r);
701 p.next = null; // help GC
702 failed = false;
703 return;
704 }
705 }
706 if (shouldParkAfterFailedAcquire(p, node) &&
707 parkAndCheckInterrupt())
708 throw new InterruptedException();
709 }
710 } finally {
711 if (failed)
712 cancelAcquire(node);
713 }
714 }
715
716 /**
717 * Acquires in shared timed mode.
718 *
719 * @param arg the acquire argument
720 * @param nanosTimeout max wait time
721 * @return {@code true} if acquired
722 */
723 private boolean doAcquireSharedNanos(long arg, long nanosTimeout)
724 throws InterruptedException {
725
726 long lastTime = System.nanoTime();
727 final Node node = addWaiter(Node.SHARED);
728 boolean failed = true;
729 try {
730 for (;;) {
731 final Node p = node.predecessor();
732 if (p == head) {
733 long r = tryAcquireShared(arg);
734 if (r >= 0) {
735 setHeadAndPropagate(node, r);
736 p.next = null; // help GC
737 failed = false;
738 return true;
739 }
740 }
741 if (nanosTimeout <= 0)
742 return false;
743 if (shouldParkAfterFailedAcquire(p, node) &&
744 nanosTimeout > spinForTimeoutThreshold)
745 LockSupport.parkNanos(this, nanosTimeout);
746 long now = System.nanoTime();
747 nanosTimeout -= now - lastTime;
748 lastTime = now;
749 if (Thread.interrupted())
750 throw new InterruptedException();
751 }
752 } finally {
753 if (failed)
754 cancelAcquire(node);
755 }
756 }
757
758 // Main exported methods
759
760 /**
761 * Attempts to acquire in exclusive mode. This method should query
762 * if the state of the object permits it to be acquired in the
763 * exclusive mode, and if so to acquire it.
764 *
765 * <p>This method is always invoked by the thread performing
766 * acquire. If this method reports failure, the acquire method
767 * may queue the thread, if it is not already queued, until it is
768 * signalled by a release from some other thread. This can be used
769 * to implement method {@link Lock#tryLock()}.
770 *
771 * <p>The default
772 * implementation throws {@link UnsupportedOperationException}.
773 *
774 * @param arg the acquire argument. This value is always the one
775 * passed to an acquire method, or is the value saved on entry
776 * to a condition wait. The value is otherwise uninterpreted
777 * and can represent anything you like.
778 * @return {@code true} if successful. Upon success, this object has
779 * been acquired.
780 * @throws IllegalMonitorStateException if acquiring would place this
781 * synchronizer in an illegal state. This exception must be
782 * thrown in a consistent fashion for synchronization to work
783 * correctly.
784 * @throws UnsupportedOperationException if exclusive mode is not supported
785 */
786 protected boolean tryAcquire(long arg) {
787 throw new UnsupportedOperationException();
788 }
789
790 /**
791 * Attempts to set the state to reflect a release in exclusive
792 * mode.
793 *
794 * <p>This method is always invoked by the thread performing release.
795 *
796 * <p>The default implementation throws
797 * {@link UnsupportedOperationException}.
798 *
799 * @param arg the release argument. This value is always the one
800 * passed to a release method, or the current state value upon
801 * entry to a condition wait. The value is otherwise
802 * uninterpreted and can represent anything you like.
803 * @return {@code true} if this object is now in a fully released
804 * state, so that any waiting threads may attempt to acquire;
805 * and {@code false} otherwise.
806 * @throws IllegalMonitorStateException if releasing would place this
807 * synchronizer in an illegal state. This exception must be
808 * thrown in a consistent fashion for synchronization to work
809 * correctly.
810 * @throws UnsupportedOperationException if exclusive mode is not supported
811 */
812 protected boolean tryRelease(long arg) {
813 throw new UnsupportedOperationException();
814 }
815
816 /**
817 * Attempts to acquire in shared mode. This method should query if
818 * the state of the object permits it to be acquired in the shared
819 * mode, and if so to acquire it.
820 *
821 * <p>This method is always invoked by the thread performing
822 * acquire. If this method reports failure, the acquire method
823 * may queue the thread, if it is not already queued, until it is
824 * signalled by a release from some other thread.
825 *
826 * <p>The default implementation throws {@link
827 * UnsupportedOperationException}.
828 *
829 * @param arg the acquire argument. This value is always the one
830 * passed to an acquire method, or is the value saved on entry
831 * to a condition wait. The value is otherwise uninterpreted
832 * and can represent anything you like.
833 * @return a negative value on failure; zero if acquisition in shared
834 * mode succeeded but no subsequent shared-mode acquire can
835 * succeed; and a positive value if acquisition in shared
836 * mode succeeded and subsequent shared-mode acquires might
837 * also succeed, in which case a subsequent waiting thread
838 * must check availability. (Support for three different
839 * return values enables this method to be used in contexts
840 * where acquires only sometimes act exclusively.) Upon
841 * success, this object has been acquired.
842 * @throws IllegalMonitorStateException if acquiring would place this
843 * synchronizer in an illegal state. This exception must be
844 * thrown in a consistent fashion for synchronization to work
845 * correctly.
846 * @throws UnsupportedOperationException if shared mode is not supported
847 */
848 protected long tryAcquireShared(long arg) {
849 throw new UnsupportedOperationException();
850 }
851
852 /**
853 * Attempts to set the state to reflect a release in shared mode.
854 *
855 * <p>This method is always invoked by the thread performing release.
856 *
857 * <p>The default implementation throws
858 * {@link UnsupportedOperationException}.
859 *
860 * @param arg the release argument. This value is always the one
861 * passed to a release method, or the current state value upon
862 * entry to a condition wait. The value is otherwise
863 * uninterpreted and can represent anything you like.
864 * @return {@code true} if this release of shared mode may permit a
865 * waiting acquire (shared or exclusive) to succeed; and
866 * {@code false} otherwise
867 * @throws IllegalMonitorStateException if releasing would place this
868 * synchronizer in an illegal state. This exception must be
869 * thrown in a consistent fashion for synchronization to work
870 * correctly.
871 * @throws UnsupportedOperationException if shared mode is not supported
872 */
873 protected boolean tryReleaseShared(long arg) {
874 throw new UnsupportedOperationException();
875 }
876
877 /**
878 * Returns {@code true} if synchronization is held exclusively with
879 * respect to the current (calling) thread. This method is invoked
880 * upon each call to a non-waiting {@link ConditionObject} method.
881 * (Waiting methods instead invoke {@link #release}.)
882 *
883 * <p>The default implementation throws {@link
884 * UnsupportedOperationException}. This method is invoked
885 * internally only within {@link ConditionObject} methods, so need
886 * not be defined if conditions are not used.
887 *
888 * @return {@code true} if synchronization is held exclusively;
889 * {@code false} otherwise
890 * @throws UnsupportedOperationException if conditions are not supported
891 */
892 protected boolean isHeldExclusively() {
893 throw new UnsupportedOperationException();
894 }
895
896 /**
897 * Acquires in exclusive mode, ignoring interrupts. Implemented
898 * by invoking at least once {@link #tryAcquire},
899 * returning on success. Otherwise the thread is queued, possibly
900 * repeatedly blocking and unblocking, invoking {@link
901 * #tryAcquire} until success. This method can be used
902 * to implement method {@link Lock#lock}.
903 *
904 * @param arg the acquire argument. This value is conveyed to
905 * {@link #tryAcquire} but is otherwise uninterpreted and
906 * can represent anything you like.
907 */
908 public final void acquire(long arg) {
909 if (!tryAcquire(arg) &&
910 acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
911 selfInterrupt();
912 }
913
914 /**
915 * Acquires in exclusive mode, aborting if interrupted.
916 * Implemented by first checking interrupt status, then invoking
917 * at least once {@link #tryAcquire}, returning on
918 * success. Otherwise the thread is queued, possibly repeatedly
919 * blocking and unblocking, invoking {@link #tryAcquire}
920 * until success or the thread is interrupted. This method can be
921 * used to implement method {@link Lock#lockInterruptibly}.
922 *
923 * @param arg the acquire argument. This value is conveyed to
924 * {@link #tryAcquire} but is otherwise uninterpreted and
925 * can represent anything you like.
926 * @throws InterruptedException if the current thread is interrupted
927 */
928 public final void acquireInterruptibly(long arg) throws InterruptedException {
929 if (Thread.interrupted())
930 throw new InterruptedException();
931 if (!tryAcquire(arg))
932 doAcquireInterruptibly(arg);
933 }
934
935 /**
936 * Attempts to acquire in exclusive mode, aborting if interrupted,
937 * and failing if the given timeout elapses. Implemented by first
938 * checking interrupt status, then invoking at least once {@link
939 * #tryAcquire}, returning on success. Otherwise, the thread is
940 * queued, possibly repeatedly blocking and unblocking, invoking
941 * {@link #tryAcquire} until success or the thread is interrupted
942 * or the timeout elapses. This method can be used to implement
943 * method {@link Lock#tryLock(long, TimeUnit)}.
944 *
945 * @param arg the acquire argument. This value is conveyed to
946 * {@link #tryAcquire} but is otherwise uninterpreted and
947 * can represent anything you like.
948 * @param nanosTimeout the maximum number of nanoseconds to wait
949 * @return {@code true} if acquired; {@code false} if timed out
950 * @throws InterruptedException if the current thread is interrupted
951 */
952 public final boolean tryAcquireNanos(long arg, long nanosTimeout) throws InterruptedException {
953 if (Thread.interrupted())
954 throw new InterruptedException();
955 return tryAcquire(arg) ||
956 doAcquireNanos(arg, nanosTimeout);
957 }
958
959 /**
960 * Releases in exclusive mode. Implemented by unblocking one or
961 * more threads if {@link #tryRelease} returns true.
962 * This method can be used to implement method {@link Lock#unlock}.
963 *
964 * @param arg the release argument. This value is conveyed to
965 * {@link #tryRelease} but is otherwise uninterpreted and
966 * can represent anything you like.
967 * @return the value returned from {@link #tryRelease}
968 */
969 public final boolean release(long arg) {
970 if (tryRelease(arg)) {
971 Node h = head;
972 if (h != null && h.waitStatus != 0)
973 unparkSuccessor(h);
974 return true;
975 }
976 return false;
977 }
978
979 /**
980 * Acquires in shared mode, ignoring interrupts. Implemented by
981 * first invoking at least once {@link #tryAcquireShared},
982 * returning on success. Otherwise the thread is queued, possibly
983 * repeatedly blocking and unblocking, invoking {@link
984 * #tryAcquireShared} until success.
985 *
986 * @param arg the acquire argument. This value is conveyed to
987 * {@link #tryAcquireShared} but is otherwise uninterpreted
988 * and can represent anything you like.
989 */
990 public final void acquireShared(long arg) {
991 if (tryAcquireShared(arg) < 0)
992 doAcquireShared(arg);
993 }
994
995 /**
996 * Acquires in shared mode, aborting if interrupted. Implemented
997 * by first checking interrupt status, then invoking at least once
998 * {@link #tryAcquireShared}, returning on success. Otherwise the
999 * thread is queued, possibly repeatedly blocking and unblocking,
1000 * invoking {@link #tryAcquireShared} until success or the thread
1001 * is interrupted.
1002 * @param arg the acquire argument
1003 * This value is conveyed to {@link #tryAcquireShared} but is
1004 * otherwise uninterpreted and can represent anything
1005 * you like.
1006 * @throws InterruptedException if the current thread is interrupted
1007 */
1008 public final void acquireSharedInterruptibly(long arg) throws InterruptedException {
1009 if (Thread.interrupted())
1010 throw new InterruptedException();
1011 if (tryAcquireShared(arg) < 0)
1012 doAcquireSharedInterruptibly(arg);
1013 }
1014
1015 /**
1016 * Attempts to acquire in shared mode, aborting if interrupted, and
1017 * failing if the given timeout elapses. Implemented by first
1018 * checking interrupt status, then invoking at least once {@link
1019 * #tryAcquireShared}, returning on success. Otherwise, the
1020 * thread is queued, possibly repeatedly blocking and unblocking,
1021 * invoking {@link #tryAcquireShared} until success or the thread
1022 * is interrupted or the timeout elapses.
1023 *
1024 * @param arg the acquire argument. This value is conveyed to
1025 * {@link #tryAcquireShared} but is otherwise uninterpreted
1026 * and can represent anything you like.
1027 * @param nanosTimeout the maximum number of nanoseconds to wait
1028 * @return {@code true} if acquired; {@code false} if timed out
1029 * @throws InterruptedException if the current thread is interrupted
1030 */
1031 public final boolean tryAcquireSharedNanos(long arg, long nanosTimeout) throws InterruptedException {
1032 if (Thread.interrupted())
1033 throw new InterruptedException();
1034 return tryAcquireShared(arg) >= 0 ||
1035 doAcquireSharedNanos(arg, nanosTimeout);
1036 }
1037
1038 /**
1039 * Releases in shared mode. Implemented by unblocking one or more
1040 * threads if {@link #tryReleaseShared} returns true.
1041 *
1042 * @param arg the release argument. This value is conveyed to
1043 * {@link #tryReleaseShared} but is otherwise uninterpreted
1044 * and can represent anything you like.
1045 * @return the value returned from {@link #tryReleaseShared}
1046 */
1047 public final boolean releaseShared(long arg) {
1048 if (tryReleaseShared(arg)) {
1049 Node h = head;
1050 if (h != null && h.waitStatus != 0)
1051 unparkSuccessor(h);
1052 return true;
1053 }
1054 return false;
1055 }
1056
1057 // Queue inspection methods
1058
1059 /**
1060 * Queries whether any threads are waiting to acquire. Note that
1061 * because cancellations due to interrupts and timeouts may occur
1062 * at any time, a {@code true} return does not guarantee that any
1063 * other thread will ever acquire.
1064 *
1065 * <p>In this implementation, this operation returns in
1066 * constant time.
1067 *
1068 * @return {@code true} if there may be other threads waiting to acquire
1069 */
1070 public final boolean hasQueuedThreads() {
1071 return head != tail;
1072 }
1073
1074 /**
1075 * Queries whether any threads have ever contended to acquire this
1076 * synchronizer; that is if an acquire method has ever blocked.
1077 *
1078 * <p>In this implementation, this operation returns in
1079 * constant time.
1080 *
1081 * @return {@code true} if there has ever been contention
1082 */
1083 public final boolean hasContended() {
1084 return head != null;
1085 }
1086
1087 /**
1088 * Returns the first (longest-waiting) thread in the queue, or
1089 * {@code null} if no threads are currently queued.
1090 *
1091 * <p>In this implementation, this operation normally returns in
1092 * constant time, but may iterate upon contention if other threads are
1093 * concurrently modifying the queue.
1094 *
1095 * @return the first (longest-waiting) thread in the queue, or
1096 * {@code null} if no threads are currently queued
1097 */
1098 public final Thread getFirstQueuedThread() {
1099 // handle only fast path, else relay
1100 return (head == tail) ? null : fullGetFirstQueuedThread();
1101 }
1102
1103 /**
1104 * Version of getFirstQueuedThread called when fastpath fails
1105 */
1106 private Thread fullGetFirstQueuedThread() {
1107 /*
1108 * The first node is normally head.next. Try to get its
1109 * thread field, ensuring consistent reads: If thread
1110 * field is nulled out or s.prev is no longer head, then
1111 * some other thread(s) concurrently performed setHead in
1112 * between some of our reads. We try this twice before
1113 * resorting to traversal.
1114 */
1115 Node h, s;
1116 Thread st;
1117 if (((h = head) != null && (s = h.next) != null &&
1118 s.prev == head && (st = s.thread) != null) ||
1119 ((h = head) != null && (s = h.next) != null &&
1120 s.prev == head && (st = s.thread) != null))
1121 return st;
1122
1123 /*
1124 * Head's next field might not have been set yet, or may have
1125 * been unset after setHead. So we must check to see if tail
1126 * is actually first node. If not, we continue on, safely
1127 * traversing from tail back to head to find first,
1128 * guaranteeing termination.
1129 */
1130
1131 Node t = tail;
1132 Thread firstThread = null;
1133 while (t != null && t != head) {
1134 Thread tt = t.thread;
1135 if (tt != null)
1136 firstThread = tt;
1137 t = t.prev;
1138 }
1139 return firstThread;
1140 }
1141
1142 /**
1143 * Returns true if the given thread is currently queued.
1144 *
1145 * <p>This implementation traverses the queue to determine
1146 * presence of the given thread.
1147 *
1148 * @param thread the thread
1149 * @return {@code true} if the given thread is on the queue
1150 * @throws NullPointerException if the thread is null
1151 */
1152 public final boolean isQueued(Thread thread) {
1153 if (thread == null)
1154 throw new NullPointerException();
1155 for (Node p = tail; p != null; p = p.prev)
1156 if (p.thread == thread)
1157 return true;
1158 return false;
1159 }
1160
1161 /**
1162 * Returns {@code true} if the apparent first queued thread, if one
1163 * exists, is waiting in exclusive mode. If this method returns
1164 * {@code true}, and the current thread is attempting to acquire in
1165 * shared mode (that is, this method is invoked from {@link
1166 * #tryAcquireShared}) then it is guaranteed that the current thread
1167 * is not the first queued thread. Used only as a heuristic in
1168 * ReentrantReadWriteLock.
1169 */
1170 final boolean apparentlyFirstQueuedIsExclusive() {
1171 Node h, s;
1172 return (h = head) != null &&
1173 (s = h.next) != null &&
1174 !s.isShared() &&
1175 s.thread != null;
1176 }
1177
1178 /**
1179 * Queries whether any threads have been waiting to acquire longer
1180 * than the current thread.
1181 *
1182 * <p>An invocation of this method is equivalent to (but may be
1183 * more efficient than):
1184 * <pre> {@code
1185 * getFirstQueuedThread() != Thread.currentThread() &&
1186 * hasQueuedThreads()}</pre>
1187 *
1188 * <p>Note that because cancellations due to interrupts and
1189 * timeouts may occur at any time, a {@code true} return does not
1190 * guarantee that some other thread will acquire before the current
1191 * thread. Likewise, it is possible for another thread to win a
1192 * race to enqueue after this method has returned {@code false},
1193 * due to the queue being empty.
1194 *
1195 * <p>This method is designed to be used by a fair synchronizer to
1196 * avoid <a href="AbstractQueuedSynchronizer#barging">barging</a>.
1197 * Such a synchronizer's {@link #tryAcquire} method should return
1198 * {@code false}, and its {@link #tryAcquireShared} method should
1199 * return a negative value, if this method returns {@code true}
1200 * (unless this is a reentrant acquire). For example, the {@code
1201 * tryAcquire} method for a fair, reentrant, exclusive mode
1202 * synchronizer might look like this:
1203 *
1204 * <pre> {@code
1205 * protected boolean tryAcquire(int arg) {
1206 * if (isHeldExclusively()) {
1207 * // A reentrant acquire; increment hold count
1208 * return true;
1209 * } else if (hasQueuedPredecessors()) {
1210 * return false;
1211 * } else {
1212 * // try to acquire normally
1213 * }
1214 * }}</pre>
1215 *
1216 * @return {@code true} if there is a queued thread preceding the
1217 * current thread, and {@code false} if the current thread
1218 * is at the head of the queue or the queue is empty
1219 * @since 1.7
1220 */
1221 public final boolean hasQueuedPredecessors() {
1222 // The correctness of this depends on head being initialized
1223 // before tail and on head.next being accurate if the current
1224 // thread is first in queue.
1225 Node h, s;
1226 return (h = head) != tail &&
1227 ((s = h.next) == null || s.thread != Thread.currentThread());
1228 }
1229
1230
1231 // Instrumentation and monitoring methods
1232
1233 /**
1234 * Returns an estimate of the number of threads waiting to
1235 * acquire. The value is only an estimate because the number of
1236 * threads may change dynamically while this method traverses
1237 * internal data structures. This method is designed for use in
1238 * monitoring system state, not for synchronization
1239 * control.
1240 *
1241 * @return the estimated number of threads waiting to acquire
1242 */
1243 public final int getQueueLength() {
1244 int n = 0;
1245 for (Node p = tail; p != null; p = p.prev) {
1246 if (p.thread != null)
1247 ++n;
1248 }
1249 return n;
1250 }
1251
1252 /**
1253 * Returns a collection containing threads that may be waiting to
1254 * acquire. Because the actual set of threads may change
1255 * dynamically while constructing this result, the returned
1256 * collection is only a best-effort estimate. The elements of the
1257 * returned collection are in no particular order. This method is
1258 * designed to facilitate construction of subclasses that provide
1259 * more extensive monitoring facilities.
1260 *
1261 * @return the collection of threads
1262 */
1263 public final Collection<Thread> getQueuedThreads() {
1264 ArrayList<Thread> list = new ArrayList<Thread>();
1265 for (Node p = tail; p != null; p = p.prev) {
1266 Thread t = p.thread;
1267 if (t != null)
1268 list.add(t);
1269 }
1270 return list;
1271 }
1272
1273 /**
1274 * Returns a collection containing threads that may be waiting to
1275 * acquire in exclusive mode. This has the same properties
1276 * as {@link #getQueuedThreads} except that it only returns
1277 * those threads waiting due to an exclusive acquire.
1278 *
1279 * @return the collection of threads
1280 */
1281 public final Collection<Thread> getExclusiveQueuedThreads() {
1282 ArrayList<Thread> list = new ArrayList<Thread>();
1283 for (Node p = tail; p != null; p = p.prev) {
1284 if (!p.isShared()) {
1285 Thread t = p.thread;
1286 if (t != null)
1287 list.add(t);
1288 }
1289 }
1290 return list;
1291 }
1292
1293 /**
1294 * Returns a collection containing threads that may be waiting to
1295 * acquire in shared mode. This has the same properties
1296 * as {@link #getQueuedThreads} except that it only returns
1297 * those threads waiting due to a shared acquire.
1298 *
1299 * @return the collection of threads
1300 */
1301 public final Collection<Thread> getSharedQueuedThreads() {
1302 ArrayList<Thread> list = new ArrayList<Thread>();
1303 for (Node p = tail; p != null; p = p.prev) {
1304 if (p.isShared()) {
1305 Thread t = p.thread;
1306 if (t != null)
1307 list.add(t);
1308 }
1309 }
1310 return list;
1311 }
1312
1313 /**
1314 * Returns a string identifying this synchronizer, as well as its state.
1315 * The state, in brackets, includes the String {@code "State ="}
1316 * followed by the current value of {@link #getState}, and either
1317 * {@code "nonempty"} or {@code "empty"} depending on whether the
1318 * queue is empty.
1319 *
1320 * @return a string identifying this synchronizer, as well as its state
1321 */
1322 public String toString() {
1323 long s = getState();
1324 String q = hasQueuedThreads() ? "non" : "";
1325 return super.toString() +
1326 "[State = " + s + ", " + q + "empty queue]";
1327 }
1328
1329
1330 // Internal support methods for Conditions
1331
1332 /**
1333 * Returns true if a node, always one that was initially placed on
1334 * a condition queue, is now waiting to reacquire on sync queue.
1335 * @param node the node
1336 * @return true if is reacquiring
1337 */
1338 final boolean isOnSyncQueue(Node node) {
1339 if (node.waitStatus == Node.CONDITION || node.prev == null)
1340 return false;
1341 if (node.next != null) // If has successor, it must be on queue
1342 return true;
1343 /*
1344 * node.prev can be non-null, but not yet on queue because
1345 * the CAS to place it on queue can fail. So we have to
1346 * traverse from tail to make sure it actually made it. It
1347 * will always be near the tail in calls to this method, and
1348 * unless the CAS failed (which is unlikely), it will be
1349 * there, so we hardly ever traverse much.
1350 */
1351 return findNodeFromTail(node);
1352 }
1353
1354 /**
1355 * Returns true if node is on sync queue by searching backwards from tail.
1356 * Called only when needed by isOnSyncQueue.
1357 * @return true if present
1358 */
1359 private boolean findNodeFromTail(Node node) {
1360 Node t = tail;
1361 for (;;) {
1362 if (t == node)
1363 return true;
1364 if (t == null)
1365 return false;
1366 t = t.prev;
1367 }
1368 }
1369
1370 /**
1371 * Transfers a node from a condition queue onto sync queue.
1372 * Returns true if successful.
1373 * @param node the node
1374 * @return true if successfully transferred (else the node was
1375 * cancelled before signal).
1376 */
1377 final boolean transferForSignal(Node node) {
1378 /*
1379 * If cannot change waitStatus, the node has been cancelled.
1380 */
1381 if (!compareAndSetWaitStatus(node, Node.CONDITION, 0))
1382 return false;
1383
1384 /*
1385 * Splice onto queue and try to set waitStatus of predecessor to
1386 * indicate that thread is (probably) waiting. If cancelled or
1387 * attempt to set waitStatus fails, wake up to resync (in which
1388 * case the waitStatus can be transiently and harmlessly wrong).
1389 */
1390 Node p = enq(node);
1391 int c = p.waitStatus;
1392 if (c > 0 || !compareAndSetWaitStatus(p, c, Node.SIGNAL))
1393 LockSupport.unpark(node.thread);
1394 return true;
1395 }
1396
1397 /**
1398 * Transfers node, if necessary, to sync queue after a cancelled
1399 * wait. Returns true if thread was cancelled before being
1400 * signalled.
1401 * @param current the waiting thread
1402 * @param node its node
1403 * @return true if cancelled before the node was signalled
1404 */
1405 final boolean transferAfterCancelledWait(Node node) {
1406 if (compareAndSetWaitStatus(node, Node.CONDITION, 0)) {
1407 enq(node);
1408 return true;
1409 }
1410 /*
1411 * If we lost out to a signal(), then we can't proceed
1412 * until it finishes its enq(). Cancelling during an
1413 * incomplete transfer is both rare and transient, so just
1414 * spin.
1415 */
1416 while (!isOnSyncQueue(node))
1417 Thread.yield();
1418 return false;
1419 }
1420
1421 /**
1422 * Invokes release with current state value; returns saved state.
1423 * Cancels node and throws exception on failure.
1424 * @param node the condition node for this wait
1425 * @return previous sync state
1426 */
1427 final long fullyRelease(Node node) {
1428 boolean failed = true;
1429 try {
1430 long savedState = getState();
1431 if (release(savedState)) {
1432 failed = false;
1433 return savedState;
1434 } else {
1435 throw new IllegalMonitorStateException();
1436 }
1437 } finally {
1438 if (failed)
1439 node.waitStatus = Node.CANCELLED;
1440 }
1441 }
1442
1443 // Instrumentation methods for conditions
1444
1445 /**
1446 * Queries whether the given ConditionObject
1447 * uses this synchronizer as its lock.
1448 *
1449 * @param condition the condition
1450 * @return <tt>true</tt> if owned
1451 * @throws NullPointerException if the condition is null
1452 */
1453 public final boolean owns(ConditionObject condition) {
1454 if (condition == null)
1455 throw new NullPointerException();
1456 return condition.isOwnedBy(this);
1457 }
1458
1459 /**
1460 * Queries whether any threads are waiting on the given condition
1461 * associated with this synchronizer. Note that because timeouts
1462 * and interrupts may occur at any time, a <tt>true</tt> return
1463 * does not guarantee that a future <tt>signal</tt> will awaken
1464 * any threads. This method is designed primarily for use in
1465 * monitoring of the system state.
1466 *
1467 * @param condition the condition
1468 * @return <tt>true</tt> if there are any waiting threads
1469 * @throws IllegalMonitorStateException if exclusive synchronization
1470 * is not held
1471 * @throws IllegalArgumentException if the given condition is
1472 * not associated with this synchronizer
1473 * @throws NullPointerException if the condition is null
1474 */
1475 public final boolean hasWaiters(ConditionObject condition) {
1476 if (!owns(condition))
1477 throw new IllegalArgumentException("Not owner");
1478 return condition.hasWaiters();
1479 }
1480
1481 /**
1482 * Returns an estimate of the number of threads waiting on the
1483 * given condition associated with this synchronizer. Note that
1484 * because timeouts and interrupts may occur at any time, the
1485 * estimate serves only as an upper bound on the actual number of
1486 * waiters. This method is designed for use in monitoring of the
1487 * system state, not for synchronization control.
1488 *
1489 * @param condition the condition
1490 * @return the estimated number of waiting threads
1491 * @throws IllegalMonitorStateException if exclusive synchronization
1492 * is not held
1493 * @throws IllegalArgumentException if the given condition is
1494 * not associated with this synchronizer
1495 * @throws NullPointerException if the condition is null
1496 */
1497 public final int getWaitQueueLength(ConditionObject condition) {
1498 if (!owns(condition))
1499 throw new IllegalArgumentException("Not owner");
1500 return condition.getWaitQueueLength();
1501 }
1502
1503 /**
1504 * Returns a collection containing those threads that may be
1505 * waiting on the given condition associated with this
1506 * synchronizer. Because the actual set of threads may change
1507 * dynamically while constructing this result, the returned
1508 * collection is only a best-effort estimate. The elements of the
1509 * returned collection are in no particular order.
1510 *
1511 * @param condition the condition
1512 * @return the collection of threads
1513 * @throws IllegalMonitorStateException if exclusive synchronization
1514 * is not held
1515 * @throws IllegalArgumentException if the given condition is
1516 * not associated with this synchronizer
1517 * @throws NullPointerException if the condition is null
1518 */
1519 public final Collection<Thread> getWaitingThreads(ConditionObject condition) {
1520 if (!owns(condition))
1521 throw new IllegalArgumentException("Not owner");
1522 return condition.getWaitingThreads();
1523 }
1524
1525 /**
1526 * Condition implementation for a {@link
1527 * AbstractQueuedLongSynchronizer} serving as the basis of a {@link
1528 * Lock} implementation.
1529 *
1530 * <p>Method documentation for this class describes mechanics,
1531 * not behavioral specifications from the point of view of Lock
1532 * and Condition users. Exported versions of this class will in
1533 * general need to be accompanied by documentation describing
1534 * condition semantics that rely on those of the associated
1535 * <tt>AbstractQueuedLongSynchronizer</tt>.
1536 *
1537 * <p>This class is Serializable, but all fields are transient,
1538 * so deserialized conditions have no waiters.
1539 *
1540 * @since 1.6
1541 */
1542 public class ConditionObject implements Condition, java.io.Serializable {
1543 private static final long serialVersionUID = 1173984872572414699L;
1544 /** First node of condition queue. */
1545 private transient Node firstWaiter;
1546 /** Last node of condition queue. */
1547 private transient Node lastWaiter;
1548
1549 /**
1550 * Creates a new <tt>ConditionObject</tt> instance.
1551 */
1552 public ConditionObject() { }
1553
1554 // Internal methods
1555
1556 /**
1557 * Adds a new waiter to wait queue.
1558 * @return its new wait node
1559 */
1560 private Node addConditionWaiter() {
1561 Node t = lastWaiter;
1562 // If lastWaiter is cancelled, clean out.
1563 if (t != null && t.waitStatus != Node.CONDITION) {
1564 unlinkCancelledWaiters();
1565 t = lastWaiter;
1566 }
1567 Node node = new Node(Thread.currentThread(), Node.CONDITION);
1568 if (t == null)
1569 firstWaiter = node;
1570 else
1571 t.nextWaiter = node;
1572 lastWaiter = node;
1573 return node;
1574 }
1575
1576 /**
1577 * Removes and transfers nodes until hit non-cancelled one or
1578 * null. Split out from signal in part to encourage compilers
1579 * to inline the case of no waiters.
1580 * @param first (non-null) the first node on condition queue
1581 */
1582 private void doSignal(Node first) {
1583 do {
1584 if ( (firstWaiter = first.nextWaiter) == null)
1585 lastWaiter = null;
1586 first.nextWaiter = null;
1587 } while (!transferForSignal(first) &&
1588 (first = firstWaiter) != null);
1589 }
1590
1591 /**
1592 * Removes and transfers all nodes.
1593 * @param first (non-null) the first node on condition queue
1594 */
1595 private void doSignalAll(Node first) {
1596 lastWaiter = firstWaiter = null;
1597 do {
1598 Node next = first.nextWaiter;
1599 first.nextWaiter = null;
1600 transferForSignal(first);
1601 first = next;
1602 } while (first != null);
1603 }
1604
1605 /**
1606 * Unlinks cancelled waiter nodes from condition queue.
1607 * Called only while holding lock. This is called when
1608 * cancellation occurred during condition wait, and upon
1609 * insertion of a new waiter when lastWaiter is seen to have
1610 * been cancelled. This method is needed to avoid garbage
1611 * retention in the absence of signals. So even though it may
1612 * require a full traversal, it comes into play only when
1613 * timeouts or cancellations occur in the absence of
1614 * signals. It traverses all nodes rather than stopping at a
1615 * particular target to unlink all pointers to garbage nodes
1616 * without requiring many re-traversals during cancellation
1617 * storms.
1618 */
1619 private void unlinkCancelledWaiters() {
1620 Node t = firstWaiter;
1621 Node trail = null;
1622 while (t != null) {
1623 Node next = t.nextWaiter;
1624 if (t.waitStatus != Node.CONDITION) {
1625 t.nextWaiter = null;
1626 if (trail == null)
1627 firstWaiter = next;
1628 else
1629 trail.nextWaiter = next;
1630 if (next == null)
1631 lastWaiter = trail;
1632 }
1633 else
1634 trail = t;
1635 t = next;
1636 }
1637 }
1638
1639 // public methods
1640
1641 /**
1642 * Moves the longest-waiting thread, if one exists, from the
1643 * wait queue for this condition to the wait queue for the
1644 * owning lock.
1645 *
1646 * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1647 * returns {@code false}
1648 */
1649 public final void signal() {
1650 if (!isHeldExclusively())
1651 throw new IllegalMonitorStateException();
1652 Node first = firstWaiter;
1653 if (first != null)
1654 doSignal(first);
1655 }
1656
1657 /**
1658 * Moves all threads from the wait queue for this condition to
1659 * the wait queue for the owning lock.
1660 *
1661 * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1662 * returns {@code false}
1663 */
1664 public final void signalAll() {
1665 if (!isHeldExclusively())
1666 throw new IllegalMonitorStateException();
1667 Node first = firstWaiter;
1668 if (first != null)
1669 doSignalAll(first);
1670 }
1671
1672 /**
1673 * Implements uninterruptible condition wait.
1674 * <ol>
1675 * <li> Save lock state returned by {@link #getState}.
1676 * <li> Invoke {@link #release} with
1677 * saved state as argument, throwing
1678 * IllegalMonitorStateException if it fails.
1679 * <li> Block until signalled.
1680 * <li> Reacquire by invoking specialized version of
1681 * {@link #acquire} with saved state as argument.
1682 * </ol>
1683 */
1684 public final void awaitUninterruptibly() {
1685 Node node = addConditionWaiter();
1686 long savedState = fullyRelease(node);
1687 boolean interrupted = false;
1688 while (!isOnSyncQueue(node)) {
1689 LockSupport.park(this);
1690 if (Thread.interrupted())
1691 interrupted = true;
1692 }
1693 if (acquireQueued(node, savedState) || interrupted)
1694 selfInterrupt();
1695 }
1696
1697 /*
1698 * For interruptible waits, we need to track whether to throw
1699 * InterruptedException, if interrupted while blocked on
1700 * condition, versus reinterrupt current thread, if
1701 * interrupted while blocked waiting to re-acquire.
1702 */
1703
1704 /** Mode meaning to reinterrupt on exit from wait */
1705 private static final int REINTERRUPT = 1;
1706 /** Mode meaning to throw InterruptedException on exit from wait */
1707 private static final int THROW_IE = -1;
1708
1709 /**
1710 * Checks for interrupt, returning THROW_IE if interrupted
1711 * before signalled, REINTERRUPT if after signalled, or
1712 * 0 if not interrupted.
1713 */
1714 private int checkInterruptWhileWaiting(Node node) {
1715 return Thread.interrupted() ?
1716 (transferAfterCancelledWait(node) ? THROW_IE : REINTERRUPT) :
1717 0;
1718 }
1719
1720 /**
1721 * Throws InterruptedException, reinterrupts current thread, or
1722 * does nothing, depending on mode.
1723 */
1724 private void reportInterruptAfterWait(int interruptMode)
1725 throws InterruptedException {
1726 if (interruptMode == THROW_IE)
1727 throw new InterruptedException();
1728 else if (interruptMode == REINTERRUPT)
1729 selfInterrupt();
1730 }
1731
1732 /**
1733 * Implements interruptible condition wait.
1734 * <ol>
1735 * <li> If current thread is interrupted, throw InterruptedException.
1736 * <li> Save lock state returned by {@link #getState}.
1737 * <li> Invoke {@link #release} with
1738 * saved state as argument, throwing
1739 * IllegalMonitorStateException if it fails.
1740 * <li> Block until signalled or interrupted.
1741 * <li> Reacquire by invoking specialized version of
1742 * {@link #acquire} with saved state as argument.
1743 * <li> If interrupted while blocked in step 4, throw InterruptedException.
1744 * </ol>
1745 */
1746 public final void await() throws InterruptedException {
1747 if (Thread.interrupted())
1748 throw new InterruptedException();
1749 Node node = addConditionWaiter();
1750 long savedState = fullyRelease(node);
1751 int interruptMode = 0;
1752 while (!isOnSyncQueue(node)) {
1753 LockSupport.park(this);
1754 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1755 break;
1756 }
1757 if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1758 interruptMode = REINTERRUPT;
1759 if (node.nextWaiter != null) // clean up if cancelled
1760 unlinkCancelledWaiters();
1761 if (interruptMode != 0)
1762 reportInterruptAfterWait(interruptMode);
1763 }
1764
1765 /**
1766 * Implements timed condition wait.
1767 * <ol>
1768 * <li> If current thread is interrupted, throw InterruptedException.
1769 * <li> Save lock state returned by {@link #getState}.
1770 * <li> Invoke {@link #release} with
1771 * saved state as argument, throwing
1772 * IllegalMonitorStateException if it fails.
1773 * <li> Block until signalled, interrupted, or timed out.
1774 * <li> Reacquire by invoking specialized version of
1775 * {@link #acquire} with saved state as argument.
1776 * <li> If interrupted while blocked in step 4, throw InterruptedException.
1777 * </ol>
1778 */
1779 public final long awaitNanos(long nanosTimeout) throws InterruptedException {
1780 if (Thread.interrupted())
1781 throw new InterruptedException();
1782 Node node = addConditionWaiter();
1783 long savedState = fullyRelease(node);
1784 long lastTime = System.nanoTime();
1785 int interruptMode = 0;
1786 while (!isOnSyncQueue(node)) {
1787 if (nanosTimeout <= 0L) {
1788 transferAfterCancelledWait(node);
1789 break;
1790 }
1791 LockSupport.parkNanos(this, nanosTimeout);
1792 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1793 break;
1794
1795 long now = System.nanoTime();
1796 nanosTimeout -= now - lastTime;
1797 lastTime = now;
1798 }
1799 if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1800 interruptMode = REINTERRUPT;
1801 if (node.nextWaiter != null)
1802 unlinkCancelledWaiters();
1803 if (interruptMode != 0)
1804 reportInterruptAfterWait(interruptMode);
1805 return nanosTimeout - (System.nanoTime() - lastTime);
1806 }
1807
1808 /**
1809 * Implements absolute timed condition wait.
1810 * <ol>
1811 * <li> If current thread is interrupted, throw InterruptedException.
1812 * <li> Save lock state returned by {@link #getState}.
1813 * <li> Invoke {@link #release} with
1814 * saved state as argument, throwing
1815 * IllegalMonitorStateException if it fails.
1816 * <li> Block until signalled, interrupted, or timed out.
1817 * <li> Reacquire by invoking specialized version of
1818 * {@link #acquire} with saved state as argument.
1819 * <li> If interrupted while blocked in step 4, throw InterruptedException.
1820 * <li> If timed out while blocked in step 4, return false, else true.
1821 * </ol>
1822 */
1823 public final boolean awaitUntil(Date deadline) throws InterruptedException {
1824 if (deadline == null)
1825 throw new NullPointerException();
1826 long abstime = deadline.getTime();
1827 if (Thread.interrupted())
1828 throw new InterruptedException();
1829 Node node = addConditionWaiter();
1830 long savedState = fullyRelease(node);
1831 boolean timedout = false;
1832 int interruptMode = 0;
1833 while (!isOnSyncQueue(node)) {
1834 if (System.currentTimeMillis() > abstime) {
1835 timedout = transferAfterCancelledWait(node);
1836 break;
1837 }
1838 LockSupport.parkUntil(this, abstime);
1839 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1840 break;
1841 }
1842 if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1843 interruptMode = REINTERRUPT;
1844 if (node.nextWaiter != null)
1845 unlinkCancelledWaiters();
1846 if (interruptMode != 0)
1847 reportInterruptAfterWait(interruptMode);
1848 return !timedout;
1849 }
1850
1851 /**
1852 * Implements timed condition wait.
1853 * <ol>
1854 * <li> If current thread is interrupted, throw InterruptedException.
1855 * <li> Save lock state returned by {@link #getState}.
1856 * <li> Invoke {@link #release} with
1857 * saved state as argument, throwing
1858 * IllegalMonitorStateException if it fails.
1859 * <li> Block until signalled, interrupted, or timed out.
1860 * <li> Reacquire by invoking specialized version of
1861 * {@link #acquire} with saved state as argument.
1862 * <li> If interrupted while blocked in step 4, throw InterruptedException.
1863 * <li> If timed out while blocked in step 4, return false, else true.
1864 * </ol>
1865 */
1866 public final boolean await(long time, TimeUnit unit) throws InterruptedException {
1867 if (unit == null)
1868 throw new NullPointerException();
1869 long nanosTimeout = unit.toNanos(time);
1870 if (Thread.interrupted())
1871 throw new InterruptedException();
1872 Node node = addConditionWaiter();
1873 long savedState = fullyRelease(node);
1874 long lastTime = System.nanoTime();
1875 boolean timedout = false;
1876 int interruptMode = 0;
1877 while (!isOnSyncQueue(node)) {
1878 if (nanosTimeout <= 0L) {
1879 timedout = transferAfterCancelledWait(node);
1880 break;
1881 }
1882 if (nanosTimeout >= spinForTimeoutThreshold)
1883 LockSupport.parkNanos(this, nanosTimeout);
1884 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
1885 break;
1886 long now = System.nanoTime();
1887 nanosTimeout -= now - lastTime;
1888 lastTime = now;
1889 }
1890 if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
1891 interruptMode = REINTERRUPT;
1892 if (node.nextWaiter != null)
1893 unlinkCancelledWaiters();
1894 if (interruptMode != 0)
1895 reportInterruptAfterWait(interruptMode);
1896 return !timedout;
1897 }
1898
1899 // support for instrumentation
1900
1901 /**
1902 * Returns true if this condition was created by the given
1903 * synchronization object.
1904 *
1905 * @return {@code true} if owned
1906 */
1907 final boolean isOwnedBy(AbstractQueuedLongSynchronizer sync) {
1908 return sync == AbstractQueuedLongSynchronizer.this;
1909 }
1910
1911 /**
1912 * Queries whether any threads are waiting on this condition.
1913 * Implements {@link AbstractQueuedLongSynchronizer#hasWaiters}.
1914 *
1915 * @return {@code true} if there are any waiting threads
1916 * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1917 * returns {@code false}
1918 */
1919 protected final boolean hasWaiters() {
1920 if (!isHeldExclusively())
1921 throw new IllegalMonitorStateException();
1922 for (Node w = firstWaiter; w != null; w = w.nextWaiter) {
1923 if (w.waitStatus == Node.CONDITION)
1924 return true;
1925 }
1926 return false;
1927 }
1928
1929 /**
1930 * Returns an estimate of the number of threads waiting on
1931 * this condition.
1932 * Implements {@link AbstractQueuedLongSynchronizer#getWaitQueueLength}.
1933 *
1934 * @return the estimated number of waiting threads
1935 * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1936 * returns {@code false}
1937 */
1938 protected final int getWaitQueueLength() {
1939 if (!isHeldExclusively())
1940 throw new IllegalMonitorStateException();
1941 int n = 0;
1942 for (Node w = firstWaiter; w != null; w = w.nextWaiter) {
1943 if (w.waitStatus == Node.CONDITION)
1944 ++n;
1945 }
1946 return n;
1947 }
1948
1949 /**
1950 * Returns a collection containing those threads that may be
1951 * waiting on this Condition.
1952 * Implements {@link AbstractQueuedLongSynchronizer#getWaitingThreads}.
1953 *
1954 * @return the collection of threads
1955 * @throws IllegalMonitorStateException if {@link #isHeldExclusively}
1956 * returns {@code false}
1957 */
1958 protected final Collection<Thread> getWaitingThreads() {
1959 if (!isHeldExclusively())
1960 throw new IllegalMonitorStateException();
1961 ArrayList<Thread> list = new ArrayList<Thread>();
1962 for (Node w = firstWaiter; w != null; w = w.nextWaiter) {
1963 if (w.waitStatus == Node.CONDITION) {
1964 Thread t = w.thread;
1965 if (t != null)
1966 list.add(t);
1967 }
1968 }
1969 return list;
1970 }
1971 }
1972
1973 /**
1974 * Setup to support compareAndSet. We need to natively implement
1975 * this here: For the sake of permitting future enhancements, we
1976 * cannot explicitly subclass AtomicLong, which would be
1977 * efficient and useful otherwise. So, as the lesser of evils, we
1978 * natively implement using hotspot intrinsics API. And while we
1979 * are at it, we do the same for other CASable fields (which could
1980 * otherwise be done with atomic field updaters).
1981 */
1982 private static final Unsafe unsafe = Unsafe.getUnsafe();
1983 private static final long stateOffset;
1984 private static final long headOffset;
1985 private static final long tailOffset;
1986 private static final long waitStatusOffset;
1987 private static final long nextOffset;
1988
1989 static {
1990 try {
1991 stateOffset = unsafe.objectFieldOffset
1992 (AbstractQueuedLongSynchronizer.class.getDeclaredField("state"));
1993 headOffset = unsafe.objectFieldOffset
1994 (AbstractQueuedLongSynchronizer.class.getDeclaredField("head"));
1995 tailOffset = unsafe.objectFieldOffset
1996 (AbstractQueuedLongSynchronizer.class.getDeclaredField("tail"));
1997 waitStatusOffset = unsafe.objectFieldOffset
1998 (Node.class.getDeclaredField("waitStatus"));
1999 nextOffset = unsafe.objectFieldOffset
2000 (Node.class.getDeclaredField("next"));
2001
2002 } catch (Exception ex) { throw new Error(ex); }
2003 }
2004
2005 /**
2006 * CAS head field. Used only by enq.
2007 */
2008 private final boolean compareAndSetHead(Node update) {
2009 return unsafe.compareAndSwapObject(this, headOffset, null, update);
2010 }
2011
2012 /**
2013 * CAS tail field. Used only by enq.
2014 */
2015 private final boolean compareAndSetTail(Node expect, Node update) {
2016 return unsafe.compareAndSwapObject(this, tailOffset, expect, update);
2017 }
2018
2019 /**
2020 * CAS waitStatus field of a node.
2021 */
2022 private final static boolean compareAndSetWaitStatus(Node node,
2023 int expect,
2024 int update) {
2025 return unsafe.compareAndSwapInt(node, waitStatusOffset,
2026 expect, update);
2027 }
2028
2029 /**
2030 * CAS next field of a node.
2031 */
2032 private final static boolean compareAndSetNext(Node node,
2033 Node expect,
2034 Node update) {
2035 return unsafe.compareAndSwapObject(node, nextOffset, expect, update);
2036 }
2037}