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