⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractqueuedlongsynchronizer.java

📁 JAVA 所有包
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     * monitoring of the system state.     *     * @param condition the condition     * @return <tt>true</tt> if there are any waiting threads     * @throws IllegalMonitorStateException if exclusive synchronization     *         is not held     * @throws IllegalArgumentException if the given condition is     *         not associated with this synchronizer     * @throws NullPointerException if the condition is null     */    public final boolean hasWaiters(ConditionObject condition) {        if (!owns(condition))            throw new IllegalArgumentException("Not owner");        return condition.hasWaiters();    }    /**     * Returns an estimate of the number of threads waiting on the     * given condition associated with this synchronizer. Note that     * because timeouts and interrupts may occur at any time, the     * estimate serves only as an upper bound on the actual number of     * waiters.  This method is designed for use in monitoring of the     * system state, not for synchronization control.     *     * @param condition the condition     * @return the estimated number of waiting threads     * @throws IllegalMonitorStateException if exclusive synchronization     *         is not held     * @throws IllegalArgumentException if the given condition is     *         not associated with this synchronizer     * @throws NullPointerException if the condition is null     */    public final int getWaitQueueLength(ConditionObject condition) {        if (!owns(condition))            throw new IllegalArgumentException("Not owner");        return condition.getWaitQueueLength();    }    /**     * Returns a collection containing those threads that may be     * waiting on the given condition associated with this     * synchronizer.  Because the actual set of threads may change     * dynamically while constructing this result, the returned     * collection is only a best-effort estimate. The elements of the     * returned collection are in no particular order.     *     * @param condition the condition     * @return the collection of threads     * @throws IllegalMonitorStateException if exclusive synchronization     *         is not held     * @throws IllegalArgumentException if the given condition is     *         not associated with this synchronizer     * @throws NullPointerException if the condition is null     */    public final Collection<Thread> getWaitingThreads(ConditionObject condition) {        if (!owns(condition))            throw new IllegalArgumentException("Not owner");        return condition.getWaitingThreads();    }    /**     * Condition implementation for a {@link     * AbstractQueuedLongSynchronizer} serving as the basis of a {@link     * Lock} implementation.     *     * <p>Method documentation for this class describes mechanics,     * not behavioral specifications from the point of view of Lock     * and Condition users. Exported versions of this class will in     * general need to be accompanied by documentation describing     * condition semantics that rely on those of the associated     * <tt>AbstractQueuedLongSynchronizer</tt>.     *     * <p>This class is Serializable, but all fields are transient,     * so deserialized conditions have no waiters.     *     * @since 1.6     */    public class ConditionObject implements Condition, java.io.Serializable {        private static final long serialVersionUID = 1173984872572414699L;        /** First node of condition queue. */        private transient Node firstWaiter;        /** Last node of condition queue. */        private transient Node lastWaiter;        /**         * Creates a new <tt>ConditionObject</tt> instance.         */        public ConditionObject() { }        // Internal methods        /**         * Adds a new waiter to wait queue.         * @return its new wait node         */        private Node addConditionWaiter() {            Node node = new Node(Thread.currentThread(), Node.CONDITION);            Node t = lastWaiter;            if (t == null)                firstWaiter = node;            else                t.nextWaiter = node;            lastWaiter = node;            return node;        }        /**         * Removes and transfers nodes until hit non-cancelled one or         * null. Split out from signal in part to encourage compilers         * to inline the case of no waiters.         * @param first (non-null) the first node on condition queue         */        private void doSignal(Node first) {            do {                if ( (firstWaiter = first.nextWaiter) == null)                    lastWaiter = null;                first.nextWaiter = null;            } while (!transferForSignal(first) &&                     (first = firstWaiter) != null);        }        /**         * Removes and transfers all nodes.         * @param first (non-null) the first node on condition queue         */        private void doSignalAll(Node first) {            lastWaiter = firstWaiter  = null;            do {                Node next = first.nextWaiter;                first.nextWaiter = null;                transferForSignal(first);                first = next;            } while (first != null);        }        /**         * Returns true if given node is on this condition queue.         * Call only when holding lock.         */        private boolean isOnConditionQueue(Node node) {            return node.next != null || node == lastWaiter;        }        /**         * Unlinks a cancelled waiter node from condition queue.  This         * is called when cancellation occurred during condition wait,         * not lock wait, and is called only after lock has been         * re-acquired by a cancelled waiter and the node is not known         * to already have been dequeued.  It is needed to avoid         * garbage retention in the absence of signals. So even though         * it may require a full traversal, it comes into play only         * when timeouts or cancellations occur in the absence of         * signals.         */        private void unlinkCancelledWaiter(Node node) {            Node t = firstWaiter;            Node trail = null;            while (t != null) {                if (t == node) {                    Node next = t.nextWaiter;                    if (trail == null)                        firstWaiter = next;                    else                        trail.nextWaiter = next;                    if (lastWaiter == node)                        lastWaiter = trail;                    break;                }                trail = t;                t = t.nextWaiter;            }        }        // public methods        /**         * Moves the longest-waiting thread, if one exists, from the         * wait queue for this condition to the wait queue for the         * owning lock.         *         * @throws IllegalMonitorStateException if {@link #isHeldExclusively}         *         returns {@code false}         */        public final void signal() {            if (!isHeldExclusively())                throw new IllegalMonitorStateException();            Node first = firstWaiter;            if (first != null)                doSignal(first);        }        /**         * Moves all threads from the wait queue for this condition to         * the wait queue for the owning lock.         *         * @throws IllegalMonitorStateException if {@link #isHeldExclusively}         *         returns {@code false}         */        public final void signalAll() {            if (!isHeldExclusively())                throw new IllegalMonitorStateException();            Node first = firstWaiter;            if (first != null)                doSignalAll(first);        }        /**         * Implements uninterruptible condition wait.         * <ol>         * <li> Save lock state returned by {@link #getState}         * <li> Invoke {@link #release} with         *      saved state as argument, throwing         *      IllegalMonitorStateException if it fails.         * <li> Block until signalled         * <li> Reacquire by invoking specialized version of         *      {@link #acquire} with saved state as argument.         * </ol>         */        public final void awaitUninterruptibly() {            Node node = addConditionWaiter();            long savedState = fullyRelease(node);            boolean interrupted = false;            while (!isOnSyncQueue(node)) {                LockSupport.park(this);                if (Thread.interrupted())                    interrupted = true;            }            if (acquireQueued(node, savedState) || interrupted)                selfInterrupt();        }        /*         * For interruptible waits, we need to track whether to throw         * InterruptedException, if interrupted while blocked on         * condition, versus reinterrupt current thread, if         * interrupted while blocked waiting to re-acquire.         */        /** Mode meaning to reinterrupt on exit from wait */        private static final int REINTERRUPT =  1;        /** Mode meaning to throw InterruptedException on exit from wait */        private static final int THROW_IE    = -1;        /**         * Checks for interrupt, returning THROW_IE if interrupted         * before signalled, REINTERRUPT if after signalled, or         * 0 if not interrupted.         */        private int checkInterruptWhileWaiting(Node node) {            return (Thread.interrupted()) ?                ((transferAfterCancelledWait(node))? THROW_IE : REINTERRUPT) :                0;        }        /**         * Throws InterruptedException, reinterrupts current thread, or         * does nothing, depending on mode.         */        private void reportInterruptAfterWait(int interruptMode)            throws InterruptedException {            if (interruptMode == THROW_IE)                throw new InterruptedException();            else if (interruptMode == REINTERRUPT)                selfInterrupt();        }        /**         * Implements interruptible condition wait.         * <ol>         * <li> If current thread is interrupted, throw InterruptedException         * <li> Save lock state returned by {@link #getState}         * <li> Invoke {@link #release} with         *      saved state as argument, throwing         *      IllegalMonitorStateException  if it fails.         * <li> Block until signalled or interrupted         * <li> Reacquire by invoking specialized version of         *      {@link #acquire} with saved state as argument.         * <li> If interrupted while blocked in step 4, throw exception         * </ol>         */        public final void await() throws InterruptedException {            if (Thread.interrupted())                throw new InterruptedException();            Node node = addConditionWaiter();            long savedState = fullyRelease(node);            int interruptMode = 0;            while (!isOnSyncQueue(node)) {                LockSupport.park(this);                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)                    break;            }            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)                interruptMode = REINTERRUPT;            if (isOnConditionQueue(node))                unlinkCancelledWaiter(node);            if (interruptMode != 0)                reportInterruptAfterWait(interruptMode);        }        /**         * Implements timed condition wait.         * <ol>         * <li> If current thread is interrupted, throw InterruptedException         * <li> Save lock state returned by {@link #getState}         * <li> Invoke {@link #release} with         *      saved state as argument, throwing         *      IllegalMonitorStateException  if it fails.         * <li> Block until signalled, interrupted, or timed out         * <li> Reacquire by invoking specialized version of         *      {@link #acquire} with saved state as argument.         * <li> If interrupted while blocked in step 4, throw InterruptedException         * </ol>         */        public final long awaitNanos(long nanosTimeout) throws InterruptedException {            if (Thread.interrupted())                throw new InterruptedException();            Node node = addConditionWaiter();            long savedState = fullyRelease(node);            long lastTime = System.nanoTime();            int interruptMode = 0;            while (!isOnSyncQueue(node)) {                if (nanosTimeout <= 0L) {                    transferAfterCancelledWait(node);                    break;                }                LockSupport.parkNanos(this, nanosTimeout);                if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)                    break;                long now = System.nanoTime();                nanosTimeout -= now - lastTime;                lastTime = now;            }            if (acquireQueued(node, savedState) && interruptMode != THROW_IE)                interruptMode = REINTERRUPT;            if (isOnConditionQueue(node))                unlinkCancelledWaiter(node);            if (interruptMode != 0)                reportInterruptAfterWait(interruptMode);            return 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -