• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 
15 package com.google.common.util.concurrent;
16 
17 import static com.google.common.base.Preconditions.checkNotNull;
18 import static com.google.common.util.concurrent.Internal.toNanosSaturated;
19 
20 import com.google.common.annotations.GwtIncompatible;
21 import com.google.common.annotations.J2ktIncompatible;
22 import com.google.common.primitives.Longs;
23 import com.google.errorprone.annotations.concurrent.GuardedBy;
24 import com.google.j2objc.annotations.Weak;
25 import java.time.Duration;
26 import java.util.concurrent.TimeUnit;
27 import java.util.concurrent.locks.Condition;
28 import java.util.concurrent.locks.ReentrantLock;
29 import java.util.function.BooleanSupplier;
30 import javax.annotation.CheckForNull;
31 
32 /**
33  * A synchronization abstraction supporting waiting on arbitrary boolean conditions.
34  *
35  * <p>This class is intended as a replacement for {@link ReentrantLock}. Code using {@code Monitor}
36  * is less error-prone and more readable than code using {@code ReentrantLock}, without significant
37  * performance loss. {@code Monitor} even has the potential for performance gain by optimizing the
38  * evaluation and signaling of conditions. Signaling is entirely <a
39  * href="http://en.wikipedia.org/wiki/Monitor_(synchronization)#Implicit_signaling">implicit</a>. By
40  * eliminating explicit signaling, this class can guarantee that only one thread is awakened when a
41  * condition becomes true (no "signaling storms" due to use of {@link
42  * java.util.concurrent.locks.Condition#signalAll Condition.signalAll}) and that no signals are lost
43  * (no "hangs" due to incorrect use of {@link java.util.concurrent.locks.Condition#signal
44  * Condition.signal}).
45  *
46  * <p>A thread is said to <i>occupy</i> a monitor if it has <i>entered</i> the monitor but not yet
47  * <i>left</i>. Only one thread may occupy a given monitor at any moment. A monitor is also
48  * reentrant, so a thread may enter a monitor any number of times, and then must leave the same
49  * number of times. The <i>enter</i> and <i>leave</i> operations have the same synchronization
50  * semantics as the built-in Java language synchronization primitives.
51  *
52  * <p>A call to any of the <i>enter</i> methods with <b>void</b> return type should always be
53  * followed immediately by a <i>try/finally</i> block to ensure that the current thread leaves the
54  * monitor cleanly:
55  *
56  * <pre>{@code
57  * monitor.enter();
58  * try {
59  *   // do things while occupying the monitor
60  * } finally {
61  *   monitor.leave();
62  * }
63  * }</pre>
64  *
65  * <p>A call to any of the <i>enter</i> methods with <b>boolean</b> return type should always appear
66  * as the condition of an <i>if</i> statement containing a <i>try/finally</i> block to ensure that
67  * the current thread leaves the monitor cleanly:
68  *
69  * <pre>{@code
70  * if (monitor.tryEnter()) {
71  *   try {
72  *     // do things while occupying the monitor
73  *   } finally {
74  *     monitor.leave();
75  *   }
76  * } else {
77  *   // do other things since the monitor was not available
78  * }
79  * }</pre>
80  *
81  * <h2>Comparison with {@code synchronized} and {@code ReentrantLock}</h2>
82  *
83  * <p>The following examples show a simple threadsafe holder expressed using {@code synchronized},
84  * {@link ReentrantLock}, and {@code Monitor}.
85  *
86  * <h3>{@code synchronized}</h3>
87  *
88  * <p>This version is the fewest lines of code, largely because the synchronization mechanism used
89  * is built into the language and runtime. But the programmer has to remember to avoid a couple of
90  * common bugs: The {@code wait()} must be inside a {@code while} instead of an {@code if}, and
91  * {@code notifyAll()} must be used instead of {@code notify()} because there are two different
92  * logical conditions being awaited.
93  *
94  * <pre>{@code
95  * public class SafeBox<V> {
96  *   private V value;
97  *
98  *   public synchronized V get() throws InterruptedException {
99  *     while (value == null) {
100  *       wait();
101  *     }
102  *     V result = value;
103  *     value = null;
104  *     notifyAll();
105  *     return result;
106  *   }
107  *
108  *   public synchronized void set(V newValue) throws InterruptedException {
109  *     while (value != null) {
110  *       wait();
111  *     }
112  *     value = newValue;
113  *     notifyAll();
114  *   }
115  * }
116  * }</pre>
117  *
118  * <h3>{@code ReentrantLock}</h3>
119  *
120  * <p>This version is much more verbose than the {@code synchronized} version, and still suffers
121  * from the need for the programmer to remember to use {@code while} instead of {@code if}. However,
122  * one advantage is that we can introduce two separate {@code Condition} objects, which allows us to
123  * use {@code signal()} instead of {@code signalAll()}, which may be a performance benefit.
124  *
125  * <pre>{@code
126  * public class SafeBox<V> {
127  *   private V value;
128  *   private final ReentrantLock lock = new ReentrantLock();
129  *   private final Condition valuePresent = lock.newCondition();
130  *   private final Condition valueAbsent = lock.newCondition();
131  *
132  *   public V get() throws InterruptedException {
133  *     lock.lock();
134  *     try {
135  *       while (value == null) {
136  *         valuePresent.await();
137  *       }
138  *       V result = value;
139  *       value = null;
140  *       valueAbsent.signal();
141  *       return result;
142  *     } finally {
143  *       lock.unlock();
144  *     }
145  *   }
146  *
147  *   public void set(V newValue) throws InterruptedException {
148  *     lock.lock();
149  *     try {
150  *       while (value != null) {
151  *         valueAbsent.await();
152  *       }
153  *       value = newValue;
154  *       valuePresent.signal();
155  *     } finally {
156  *       lock.unlock();
157  *     }
158  *   }
159  * }
160  * }</pre>
161  *
162  * <h3>{@code Monitor}</h3>
163  *
164  * <p>This version adds some verbosity around the {@code Guard} objects, but removes that same
165  * verbosity, and more, from the {@code get} and {@code set} methods. {@code Monitor} implements the
166  * same efficient signaling as we had to hand-code in the {@code ReentrantLock} version above.
167  * Finally, the programmer no longer has to hand-code the wait loop, and therefore doesn't have to
168  * remember to use {@code while} instead of {@code if}.
169  *
170  * <pre>{@code
171  * public class SafeBox<V> {
172  *   private V value;
173  *   private final Monitor monitor = new Monitor();
174  *   private final Monitor.Guard valuePresent = monitor.newGuard(() -> value != null);
175  *   private final Monitor.Guard valueAbsent = monitor.newGuard(() -> value == null);
176  *
177  *   public V get() throws InterruptedException {
178  *     monitor.enterWhen(valuePresent);
179  *     try {
180  *       V result = value;
181  *       value = null;
182  *       return result;
183  *     } finally {
184  *       monitor.leave();
185  *     }
186  *   }
187  *
188  *   public void set(V newValue) throws InterruptedException {
189  *     monitor.enterWhen(valueAbsent);
190  *     try {
191  *       value = newValue;
192  *     } finally {
193  *       monitor.leave();
194  *     }
195  *   }
196  * }
197  * }</pre>
198  *
199  * @author Justin T. Sampson
200  * @author Martin Buchholz
201  * @since 10.0
202  */
203 @J2ktIncompatible
204 @GwtIncompatible
205 @SuppressWarnings("GuardedBy") // TODO(b/35466881): Fix or suppress.
206 @ElementTypesAreNonnullByDefault
207 public final class Monitor {
208   // TODO(user): Use raw LockSupport or AbstractQueuedSynchronizer instead of ReentrantLock.
209   // TODO(user): "Port" jsr166 tests for ReentrantLock.
210   //
211   // TODO(user): Change API to make it impossible to use a Guard with the "wrong" monitor,
212   //    by making the monitor implicit, and to eliminate other sources of IMSE.
213   //    Imagine:
214   //    guard.lock();
215   //    try { /* monitor locked and guard satisfied here */ }
216   //    finally { guard.unlock(); }
217   // Here are Justin's design notes about this:
218   //
219   // This idea has come up from time to time, and I think one of my
220   // earlier versions of Monitor even did something like this. I ended
221   // up strongly favoring the current interface.
222   //
223   // I probably can't remember all the reasons (it's possible you
224   // could find them in the code review archives), but here are a few:
225   //
226   // 1. What about leaving/unlocking? Are you going to do
227   //    guard.enter() paired with monitor.leave()? That might get
228   //    confusing. It's nice for the finally block to look as close as
229   //    possible to the thing right before the try. You could have
230   //    guard.leave(), but that's a little odd as well because the
231   //    guard doesn't have anything to do with leaving. You can't
232   //    really enforce that the guard you're leaving is the same one
233   //    you entered with, and it doesn't actually matter.
234   //
235   // 2. Since you can enter the monitor without a guard at all, some
236   //    places you'll have monitor.enter()/monitor.leave() and other
237   //    places you'll have guard.enter()/guard.leave() even though
238   //    it's the same lock being acquired underneath. Always using
239   //    monitor.enterXXX()/monitor.leave() will make it really clear
240   //    which lock is held at any point in the code.
241   //
242   // 3. I think "enterWhen(notEmpty)" reads better than "notEmpty.enter()".
243   //
244   // TODO(user): Implement ReentrantLock features:
245   //    - toString() method
246   //    - getOwner() method
247   //    - getQueuedThreads() method
248   //    - getWaitingThreads(Guard) method
249   //    - implement Serializable
250   //    - redo the API to be as close to identical to ReentrantLock as possible,
251   //      since, after all, this class is also a reentrant mutual exclusion lock!?
252 
253   /*
254    * One of the key challenges of this class is to prevent lost signals, while trying hard to
255    * minimize unnecessary signals. One simple and correct algorithm is to signal some other waiter
256    * with a satisfied guard (if one exists) whenever any thread occupying the monitor exits the
257    * monitor, either by unlocking all of its held locks, or by starting to wait for a guard. This
258    * includes exceptional exits, so all control paths involving signalling must be protected by a
259    * finally block.
260    *
261    * Further optimizations of this algorithm become increasingly subtle. A wait that terminates
262    * without the guard being satisfied (due to timeout, but not interrupt) can then immediately exit
263    * the monitor without signalling. If it timed out without being signalled, it does not need to
264    * "pass on" the signal to another thread. If it *was* signalled, then its guard must have been
265    * satisfied at the time of signal, and has since been modified by some other thread to be
266    * non-satisfied before reacquiring the lock, and that other thread takes over the responsibility
267    * of signaling the next waiter.
268    *
269    * Unlike the underlying Condition, if we are not careful, an interrupt *can* cause a signal to be
270    * lost, because the signal may be sent to a condition whose sole waiter has just been
271    * interrupted.
272    *
273    * Imagine a monitor with multiple guards. A thread enters the monitor, satisfies all the guards,
274    * and leaves, calling signalNextWaiter. With traditional locks and conditions, all the conditions
275    * need to be signalled because it is not known which if any of them have waiters (and hasWaiters
276    * can't be used reliably because of a check-then-act race). With our Monitor guards, we only
277    * signal the first active guard that is satisfied. But the corresponding thread may have already
278    * been interrupted and is waiting to reacquire the lock while still registered in activeGuards,
279    * in which case the signal is a no-op, and the bigger-picture signal is lost unless interrupted
280    * threads take special action by participating in the signal-passing game.
281    */
282 
283   /*
284    * Timeout handling is intricate, especially given our ambitious goals:
285    * - Avoid underflow and overflow of timeout values when specified timeouts are close to
286    *   Long.MIN_VALUE or Long.MAX_VALUE.
287    * - Favor responding to interrupts over timeouts.
288    * - System.nanoTime() is expensive enough that we want to call it the minimum required number of
289    *   times, typically once before invoking a blocking method. This often requires keeping track of
290    *   the first time in a method that nanoTime() has been invoked, for which the special value 0L
291    *   is reserved to mean "uninitialized". If timeout is non-positive, then nanoTime need never be
292    *   called.
293    * - Keep behavior of fair and non-fair instances consistent.
294    */
295 
296   /**
297    * A boolean condition for which a thread may wait. A {@code Guard} is associated with a single
298    * {@code Monitor}. The monitor may check the guard at arbitrary times from any thread occupying
299    * the monitor, so code should not be written to rely on how often a guard might or might not be
300    * checked.
301    *
302    * <p>If a {@code Guard} is passed into any method of a {@code Monitor} other than the one it is
303    * associated with, an {@link IllegalMonitorStateException} is thrown.
304    *
305    * @since 10.0
306    */
307   public abstract static class Guard {
308 
309     @Weak final Monitor monitor;
310     final Condition condition;
311 
312     @GuardedBy("monitor.lock")
313     int waiterCount = 0;
314 
315     /** The next active guard */
316     @GuardedBy("monitor.lock")
317     @CheckForNull
318     Guard next;
319 
Guard(Monitor monitor)320     protected Guard(Monitor monitor) {
321       this.monitor = checkNotNull(monitor, "monitor");
322       this.condition = monitor.lock.newCondition();
323     }
324 
325     /**
326      * Evaluates this guard's boolean condition. This method is always called with the associated
327      * monitor already occupied. Implementations of this method must depend only on state protected
328      * by the associated monitor, and must not modify that state.
329      */
isSatisfied()330     public abstract boolean isSatisfied();
331   }
332 
333   /** Whether this monitor is fair. */
334   private final boolean fair;
335 
336   /** The lock underlying this monitor. */
337   private final ReentrantLock lock;
338 
339   /**
340    * The guards associated with this monitor that currently have waiters ({@code waiterCount > 0}).
341    * A linked list threaded through the Guard.next field.
342    */
343   @GuardedBy("lock")
344   @CheckForNull
345   private Guard activeGuards = null;
346 
347   /**
348    * Creates a monitor with a non-fair (but fast) ordering policy. Equivalent to {@code
349    * Monitor(false)}.
350    */
Monitor()351   public Monitor() {
352     this(false);
353   }
354 
355   /**
356    * Creates a monitor with the given ordering policy.
357    *
358    * @param fair whether this monitor should use a fair ordering policy rather than a non-fair (but
359    *     fast) one
360    */
Monitor(boolean fair)361   public Monitor(boolean fair) {
362     this.fair = fair;
363     this.lock = new ReentrantLock(fair);
364   }
365 
366   /**
367    * Creates a new {@linkplain Guard guard} for this monitor.
368    *
369    * @param isSatisfied the new guard's boolean condition (see {@link Guard#isSatisfied
370    *     isSatisfied()})
371    * @since 21.0
372    */
newGuard(final BooleanSupplier isSatisfied)373   public Guard newGuard(final BooleanSupplier isSatisfied) {
374     checkNotNull(isSatisfied, "isSatisfied");
375     return new Guard(this) {
376       @Override
377       public boolean isSatisfied() {
378         return isSatisfied.getAsBoolean();
379       }
380     };
381   }
382 
383   /** Enters this monitor. Blocks indefinitely. */
384   public void enter() {
385     lock.lock();
386   }
387 
388   /**
389    * Enters this monitor. Blocks at most the given time.
390    *
391    * @return whether the monitor was entered
392    * @since 28.0
393    */
394   public boolean enter(Duration time) {
395     return enter(toNanosSaturated(time), TimeUnit.NANOSECONDS);
396   }
397 
398   /**
399    * Enters this monitor. Blocks at most the given time.
400    *
401    * @return whether the monitor was entered
402    */
403   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
404   public boolean enter(long time, TimeUnit unit) {
405     final long timeoutNanos = toSafeNanos(time, unit);
406     final ReentrantLock lock = this.lock;
407     if (!fair && lock.tryLock()) {
408       return true;
409     }
410     boolean interrupted = Thread.interrupted();
411     try {
412       final long startTime = System.nanoTime();
413       for (long remainingNanos = timeoutNanos; ; ) {
414         try {
415           return lock.tryLock(remainingNanos, TimeUnit.NANOSECONDS);
416         } catch (InterruptedException interrupt) {
417           interrupted = true;
418           remainingNanos = remainingNanos(startTime, timeoutNanos);
419         }
420       }
421     } finally {
422       if (interrupted) {
423         Thread.currentThread().interrupt();
424       }
425     }
426   }
427 
428   /**
429    * Enters this monitor. Blocks indefinitely, but may be interrupted.
430    *
431    * @throws InterruptedException if interrupted while waiting
432    */
433   public void enterInterruptibly() throws InterruptedException {
434     lock.lockInterruptibly();
435   }
436 
437   /**
438    * Enters this monitor. Blocks at most the given time, and may be interrupted.
439    *
440    * @return whether the monitor was entered
441    * @throws InterruptedException if interrupted while waiting
442    * @since 28.0
443    */
444   public boolean enterInterruptibly(Duration time) throws InterruptedException {
445     return enterInterruptibly(toNanosSaturated(time), TimeUnit.NANOSECONDS);
446   }
447 
448   /**
449    * Enters this monitor. Blocks at most the given time, and may be interrupted.
450    *
451    * @return whether the monitor was entered
452    * @throws InterruptedException if interrupted while waiting
453    */
454   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
455   public boolean enterInterruptibly(long time, TimeUnit unit) throws InterruptedException {
456     return lock.tryLock(time, unit);
457   }
458 
459   /**
460    * Enters this monitor if it is possible to do so immediately. Does not block.
461    *
462    * <p><b>Note:</b> This method disregards the fairness setting of this monitor.
463    *
464    * @return whether the monitor was entered
465    */
466   public boolean tryEnter() {
467     return lock.tryLock();
468   }
469 
470   /**
471    * Enters this monitor when the guard is satisfied. Blocks indefinitely, but may be interrupted.
472    *
473    * @throws InterruptedException if interrupted while waiting
474    */
475   public void enterWhen(Guard guard) throws InterruptedException {
476     if (guard.monitor != this) {
477       throw new IllegalMonitorStateException();
478     }
479     final ReentrantLock lock = this.lock;
480     boolean signalBeforeWaiting = lock.isHeldByCurrentThread();
481     lock.lockInterruptibly();
482 
483     boolean satisfied = false;
484     try {
485       if (!guard.isSatisfied()) {
486         await(guard, signalBeforeWaiting);
487       }
488       satisfied = true;
489     } finally {
490       if (!satisfied) {
491         leave();
492       }
493     }
494   }
495 
496   /**
497    * Enters this monitor when the guard is satisfied. Blocks at most the given time, including both
498    * the time to acquire the lock and the time to wait for the guard to be satisfied, and may be
499    * interrupted.
500    *
501    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
502    * @throws InterruptedException if interrupted while waiting
503    * @since 28.0
504    */
505   public boolean enterWhen(Guard guard, Duration time) throws InterruptedException {
506     return enterWhen(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
507   }
508 
509   /**
510    * Enters this monitor when the guard is satisfied. Blocks at most the given time, including both
511    * the time to acquire the lock and the time to wait for the guard to be satisfied, and may be
512    * interrupted.
513    *
514    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
515    * @throws InterruptedException if interrupted while waiting
516    */
517   @SuppressWarnings({
518     "GoodTime", // should accept a java.time.Duration
519     "LabelledBreakTarget", // TODO(b/345814817): Maybe fix.
520   })
521   public boolean enterWhen(Guard guard, long time, TimeUnit unit) throws InterruptedException {
522     final long timeoutNanos = toSafeNanos(time, unit);
523     if (guard.monitor != this) {
524       throw new IllegalMonitorStateException();
525     }
526     final ReentrantLock lock = this.lock;
527     boolean reentrant = lock.isHeldByCurrentThread();
528     long startTime = 0L;
529 
530     locked:
531     {
532       if (!fair) {
533         // Check interrupt status to get behavior consistent with fair case.
534         if (Thread.interrupted()) {
535           throw new InterruptedException();
536         }
537         if (lock.tryLock()) {
538           break locked;
539         }
540       }
541       startTime = initNanoTime(timeoutNanos);
542       if (!lock.tryLock(time, unit)) {
543         return false;
544       }
545     }
546 
547     boolean satisfied = false;
548     boolean threw = true;
549     try {
550       satisfied =
551           guard.isSatisfied()
552               || awaitNanos(
553                   guard,
554                   (startTime == 0L) ? timeoutNanos : remainingNanos(startTime, timeoutNanos),
555                   reentrant);
556       threw = false;
557       return satisfied;
558     } finally {
559       if (!satisfied) {
560         try {
561           // Don't need to signal if timed out, but do if interrupted
562           if (threw && !reentrant) {
563             signalNextWaiter();
564           }
565         } finally {
566           lock.unlock();
567         }
568       }
569     }
570   }
571 
572   /** Enters this monitor when the guard is satisfied. Blocks indefinitely. */
573   public void enterWhenUninterruptibly(Guard guard) {
574     if (guard.monitor != this) {
575       throw new IllegalMonitorStateException();
576     }
577     final ReentrantLock lock = this.lock;
578     boolean signalBeforeWaiting = lock.isHeldByCurrentThread();
579     lock.lock();
580 
581     boolean satisfied = false;
582     try {
583       if (!guard.isSatisfied()) {
584         awaitUninterruptibly(guard, signalBeforeWaiting);
585       }
586       satisfied = true;
587     } finally {
588       if (!satisfied) {
589         leave();
590       }
591     }
592   }
593 
594   /**
595    * Enters this monitor when the guard is satisfied. Blocks at most the given time, including both
596    * the time to acquire the lock and the time to wait for the guard to be satisfied.
597    *
598    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
599    * @since 28.0
600    */
601   public boolean enterWhenUninterruptibly(Guard guard, Duration time) {
602     return enterWhenUninterruptibly(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
603   }
604 
605   /**
606    * Enters this monitor when the guard is satisfied. Blocks at most the given time, including both
607    * the time to acquire the lock and the time to wait for the guard to be satisfied.
608    *
609    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
610    */
611   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
612   public boolean enterWhenUninterruptibly(Guard guard, long time, TimeUnit unit) {
613     final long timeoutNanos = toSafeNanos(time, unit);
614     if (guard.monitor != this) {
615       throw new IllegalMonitorStateException();
616     }
617     final ReentrantLock lock = this.lock;
618     long startTime = 0L;
619     boolean signalBeforeWaiting = lock.isHeldByCurrentThread();
620     boolean interrupted = Thread.interrupted();
621     try {
622       if (fair || !lock.tryLock()) {
623         startTime = initNanoTime(timeoutNanos);
624         for (long remainingNanos = timeoutNanos; ; ) {
625           try {
626             if (lock.tryLock(remainingNanos, TimeUnit.NANOSECONDS)) {
627               break;
628             } else {
629               return false;
630             }
631           } catch (InterruptedException interrupt) {
632             interrupted = true;
633             remainingNanos = remainingNanos(startTime, timeoutNanos);
634           }
635         }
636       }
637 
638       boolean satisfied = false;
639       try {
640         while (true) {
641           try {
642             if (guard.isSatisfied()) {
643               satisfied = true;
644             } else {
645               final long remainingNanos;
646               if (startTime == 0L) {
647                 startTime = initNanoTime(timeoutNanos);
648                 remainingNanos = timeoutNanos;
649               } else {
650                 remainingNanos = remainingNanos(startTime, timeoutNanos);
651               }
652               satisfied = awaitNanos(guard, remainingNanos, signalBeforeWaiting);
653             }
654             return satisfied;
655           } catch (InterruptedException interrupt) {
656             interrupted = true;
657             signalBeforeWaiting = false;
658           }
659         }
660       } finally {
661         if (!satisfied) {
662           lock.unlock(); // No need to signal if timed out
663         }
664       }
665     } finally {
666       if (interrupted) {
667         Thread.currentThread().interrupt();
668       }
669     }
670   }
671 
672   /**
673    * Enters this monitor if the guard is satisfied. Blocks indefinitely acquiring the lock, but does
674    * not wait for the guard to be satisfied.
675    *
676    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
677    */
678   public boolean enterIf(Guard guard) {
679     if (guard.monitor != this) {
680       throw new IllegalMonitorStateException();
681     }
682     final ReentrantLock lock = this.lock;
683     lock.lock();
684 
685     boolean satisfied = false;
686     try {
687       return satisfied = guard.isSatisfied();
688     } finally {
689       if (!satisfied) {
690         lock.unlock();
691       }
692     }
693   }
694 
695   /**
696    * Enters this monitor if the guard is satisfied. Blocks at most the given time acquiring the
697    * lock, but does not wait for the guard to be satisfied.
698    *
699    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
700    * @since 28.0
701    */
702   public boolean enterIf(Guard guard, Duration time) {
703     return enterIf(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
704   }
705 
706   /**
707    * Enters this monitor if the guard is satisfied. Blocks at most the given time acquiring the
708    * lock, but does not wait for the guard to be satisfied.
709    *
710    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
711    */
712   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
713   public boolean enterIf(Guard guard, long time, TimeUnit unit) {
714     if (guard.monitor != this) {
715       throw new IllegalMonitorStateException();
716     }
717     if (!enter(time, unit)) {
718       return false;
719     }
720 
721     boolean satisfied = false;
722     try {
723       return satisfied = guard.isSatisfied();
724     } finally {
725       if (!satisfied) {
726         lock.unlock();
727       }
728     }
729   }
730 
731   /**
732    * Enters this monitor if the guard is satisfied. Blocks indefinitely acquiring the lock, but does
733    * not wait for the guard to be satisfied, and may be interrupted.
734    *
735    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
736    * @throws InterruptedException if interrupted while waiting
737    */
738   public boolean enterIfInterruptibly(Guard guard) throws InterruptedException {
739     if (guard.monitor != this) {
740       throw new IllegalMonitorStateException();
741     }
742     final ReentrantLock lock = this.lock;
743     lock.lockInterruptibly();
744 
745     boolean satisfied = false;
746     try {
747       return satisfied = guard.isSatisfied();
748     } finally {
749       if (!satisfied) {
750         lock.unlock();
751       }
752     }
753   }
754 
755   /**
756    * Enters this monitor if the guard is satisfied. Blocks at most the given time acquiring the
757    * lock, but does not wait for the guard to be satisfied, and may be interrupted.
758    *
759    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
760    * @since 28.0
761    */
762   public boolean enterIfInterruptibly(Guard guard, Duration time) throws InterruptedException {
763     return enterIfInterruptibly(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
764   }
765 
766   /**
767    * Enters this monitor if the guard is satisfied. Blocks at most the given time acquiring the
768    * lock, but does not wait for the guard to be satisfied, and may be interrupted.
769    *
770    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
771    */
772   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
773   public boolean enterIfInterruptibly(Guard guard, long time, TimeUnit unit)
774       throws InterruptedException {
775     if (guard.monitor != this) {
776       throw new IllegalMonitorStateException();
777     }
778     final ReentrantLock lock = this.lock;
779     if (!lock.tryLock(time, unit)) {
780       return false;
781     }
782 
783     boolean satisfied = false;
784     try {
785       return satisfied = guard.isSatisfied();
786     } finally {
787       if (!satisfied) {
788         lock.unlock();
789       }
790     }
791   }
792 
793   /**
794    * Enters this monitor if it is possible to do so immediately and the guard is satisfied. Does not
795    * block acquiring the lock and does not wait for the guard to be satisfied.
796    *
797    * <p><b>Note:</b> This method disregards the fairness setting of this monitor.
798    *
799    * @return whether the monitor was entered, which guarantees that the guard is now satisfied
800    */
801   public boolean tryEnterIf(Guard guard) {
802     if (guard.monitor != this) {
803       throw new IllegalMonitorStateException();
804     }
805     final ReentrantLock lock = this.lock;
806     if (!lock.tryLock()) {
807       return false;
808     }
809 
810     boolean satisfied = false;
811     try {
812       return satisfied = guard.isSatisfied();
813     } finally {
814       if (!satisfied) {
815         lock.unlock();
816       }
817     }
818   }
819 
820   /**
821    * Waits for the guard to be satisfied. Waits indefinitely, but may be interrupted. May be called
822    * only by a thread currently occupying this monitor.
823    *
824    * @throws InterruptedException if interrupted while waiting
825    */
826   public void waitFor(Guard guard) throws InterruptedException {
827     if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
828       throw new IllegalMonitorStateException();
829     }
830     if (!guard.isSatisfied()) {
831       await(guard, true);
832     }
833   }
834 
835   /**
836    * Waits for the guard to be satisfied. Waits at most the given time, and may be interrupted. May
837    * be called only by a thread currently occupying this monitor.
838    *
839    * @return whether the guard is now satisfied
840    * @throws InterruptedException if interrupted while waiting
841    * @since 28.0
842    */
843   public boolean waitFor(Guard guard, Duration time) throws InterruptedException {
844     return waitFor(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
845   }
846 
847   /**
848    * Waits for the guard to be satisfied. Waits at most the given time, and may be interrupted. May
849    * be called only by a thread currently occupying this monitor.
850    *
851    * @return whether the guard is now satisfied
852    * @throws InterruptedException if interrupted while waiting
853    */
854   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
855   public boolean waitFor(Guard guard, long time, TimeUnit unit) throws InterruptedException {
856     final long timeoutNanos = toSafeNanos(time, unit);
857     if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
858       throw new IllegalMonitorStateException();
859     }
860     if (guard.isSatisfied()) {
861       return true;
862     }
863     if (Thread.interrupted()) {
864       throw new InterruptedException();
865     }
866     return awaitNanos(guard, timeoutNanos, true);
867   }
868 
869   /**
870    * Waits for the guard to be satisfied. Waits indefinitely. May be called only by a thread
871    * currently occupying this monitor.
872    */
873   public void waitForUninterruptibly(Guard guard) {
874     if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
875       throw new IllegalMonitorStateException();
876     }
877     if (!guard.isSatisfied()) {
878       awaitUninterruptibly(guard, true);
879     }
880   }
881 
882   /**
883    * Waits for the guard to be satisfied. Waits at most the given time. May be called only by a
884    * thread currently occupying this monitor.
885    *
886    * @return whether the guard is now satisfied
887    * @since 28.0
888    */
889   public boolean waitForUninterruptibly(Guard guard, Duration time) {
890     return waitForUninterruptibly(guard, toNanosSaturated(time), TimeUnit.NANOSECONDS);
891   }
892 
893   /**
894    * Waits for the guard to be satisfied. Waits at most the given time. May be called only by a
895    * thread currently occupying this monitor.
896    *
897    * @return whether the guard is now satisfied
898    */
899   @SuppressWarnings("GoodTime") // should accept a java.time.Duration
900   public boolean waitForUninterruptibly(Guard guard, long time, TimeUnit unit) {
901     final long timeoutNanos = toSafeNanos(time, unit);
902     if (!((guard.monitor == this) && lock.isHeldByCurrentThread())) {
903       throw new IllegalMonitorStateException();
904     }
905     if (guard.isSatisfied()) {
906       return true;
907     }
908     boolean signalBeforeWaiting = true;
909     final long startTime = initNanoTime(timeoutNanos);
910     boolean interrupted = Thread.interrupted();
911     try {
912       for (long remainingNanos = timeoutNanos; ; ) {
913         try {
914           return awaitNanos(guard, remainingNanos, signalBeforeWaiting);
915         } catch (InterruptedException interrupt) {
916           interrupted = true;
917           if (guard.isSatisfied()) {
918             return true;
919           }
920           signalBeforeWaiting = false;
921           remainingNanos = remainingNanos(startTime, timeoutNanos);
922         }
923       }
924     } finally {
925       if (interrupted) {
926         Thread.currentThread().interrupt();
927       }
928     }
929   }
930 
931   /** Leaves this monitor. May be called only by a thread currently occupying this monitor. */
932   public void leave() {
933     final ReentrantLock lock = this.lock;
934     try {
935       // No need to signal if we will still be holding the lock when we return
936       if (lock.getHoldCount() == 1) {
937         signalNextWaiter();
938       }
939     } finally {
940       lock.unlock(); // Will throw IllegalMonitorStateException if not held
941     }
942   }
943 
944   /** Returns whether this monitor is using a fair ordering policy. */
945   public boolean isFair() {
946     return fair;
947   }
948 
949   /**
950    * Returns whether this monitor is occupied by any thread. This method is designed for use in
951    * monitoring of the system state, not for synchronization control.
952    */
953   public boolean isOccupied() {
954     return lock.isLocked();
955   }
956 
957   /**
958    * Returns whether the current thread is occupying this monitor (has entered more times than it
959    * has left).
960    */
961   public boolean isOccupiedByCurrentThread() {
962     return lock.isHeldByCurrentThread();
963   }
964 
965   /**
966    * Returns the number of times the current thread has entered this monitor in excess of the number
967    * of times it has left. Returns 0 if the current thread is not occupying this monitor.
968    */
969   public int getOccupiedDepth() {
970     return lock.getHoldCount();
971   }
972 
973   /**
974    * Returns an estimate of the number of threads waiting to enter this monitor. The value is only
975    * an estimate because the number of threads may change dynamically while this method traverses
976    * internal data structures. This method is designed for use in monitoring of the system state,
977    * not for synchronization control.
978    */
979   public int getQueueLength() {
980     return lock.getQueueLength();
981   }
982 
983   /**
984    * Returns whether any threads are waiting to enter this monitor. Note that because cancellations
985    * may occur at any time, a {@code true} return does not guarantee that any other thread will ever
986    * enter this monitor. This method is designed primarily for use in monitoring of the system
987    * state.
988    */
989   public boolean hasQueuedThreads() {
990     return lock.hasQueuedThreads();
991   }
992 
993   /**
994    * Queries whether the given thread is waiting to enter this monitor. Note that because
995    * cancellations may occur at any time, a {@code true} return does not guarantee that this thread
996    * will ever enter this monitor. This method is designed primarily for use in monitoring of the
997    * system state.
998    */
999   public boolean hasQueuedThread(Thread thread) {
1000     return lock.hasQueuedThread(thread);
1001   }
1002 
1003   /**
1004    * Queries whether any threads are waiting for the given guard to become satisfied. Note that
1005    * because timeouts and interrupts may occur at any time, a {@code true} return does not guarantee
1006    * that the guard becoming satisfied in the future will awaken any threads. This method is
1007    * designed primarily for use in monitoring of the system state.
1008    */
1009   public boolean hasWaiters(Guard guard) {
1010     return getWaitQueueLength(guard) > 0;
1011   }
1012 
1013   /**
1014    * Returns an estimate of the number of threads waiting for the given guard to become satisfied.
1015    * Note that because timeouts and interrupts may occur at any time, the estimate serves only as an
1016    * upper bound on the actual number of waiters. This method is designed for use in monitoring of
1017    * the system state, not for synchronization control.
1018    */
1019   public int getWaitQueueLength(Guard guard) {
1020     if (guard.monitor != this) {
1021       throw new IllegalMonitorStateException();
1022     }
1023     lock.lock();
1024     try {
1025       return guard.waiterCount;
1026     } finally {
1027       lock.unlock();
1028     }
1029   }
1030 
1031   /**
1032    * Returns unit.toNanos(time), additionally ensuring the returned value is not at risk of
1033    * overflowing or underflowing, by bounding the value between 0 and (Long.MAX_VALUE / 4) * 3.
1034    * Actually waiting for more than 219 years is not supported!
1035    */
1036   private static long toSafeNanos(long time, TimeUnit unit) {
1037     long timeoutNanos = unit.toNanos(time);
1038     return Longs.constrainToRange(timeoutNanos, 0L, (Long.MAX_VALUE / 4) * 3);
1039   }
1040 
1041   /**
1042    * Returns System.nanoTime() unless the timeout has already elapsed. Returns 0L if and only if the
1043    * timeout has already elapsed.
1044    */
1045   private static long initNanoTime(long timeoutNanos) {
1046     if (timeoutNanos <= 0L) {
1047       return 0L;
1048     } else {
1049       long startTime = System.nanoTime();
1050       return (startTime == 0L) ? 1L : startTime;
1051     }
1052   }
1053 
1054   /**
1055    * Returns the remaining nanos until the given timeout, or 0L if the timeout has already elapsed.
1056    * Caller must have previously sanitized timeoutNanos using toSafeNanos.
1057    */
1058   private static long remainingNanos(long startTime, long timeoutNanos) {
1059     // assert timeoutNanos == 0L || startTime != 0L;
1060 
1061     // TODO : NOT CORRECT, BUT TESTS PASS ANYWAYS!
1062     // if (true) return timeoutNanos;
1063     // ONLY 2 TESTS FAIL IF WE DO:
1064     // if (true) return 0;
1065 
1066     return (timeoutNanos <= 0L) ? 0L : timeoutNanos - (System.nanoTime() - startTime);
1067   }
1068 
1069   /**
1070    * Signals some other thread waiting on a satisfied guard, if one exists.
1071    *
1072    * <p>We manage calls to this method carefully, to signal only when necessary, but never losing a
1073    * signal, which is the classic problem of this kind of concurrency construct. We must signal if
1074    * the current thread is about to relinquish the lock and may have changed the state protected by
1075    * the monitor, thereby causing some guard to be satisfied.
1076    *
1077    * <p>In addition, any thread that has been signalled when its guard was satisfied acquires the
1078    * responsibility of signalling the next thread when it again relinquishes the lock. Unlike a
1079    * normal Condition, there is no guarantee that an interrupted thread has not been signalled,
1080    * since the concurrency control must manage multiple Conditions. So this method must generally be
1081    * called when waits are interrupted.
1082    *
1083    * <p>On the other hand, if a signalled thread wakes up to discover that its guard is still not
1084    * satisfied, it does *not* need to call this method before returning to wait. This can only
1085    * happen due to spurious wakeup (ignorable) or another thread acquiring the lock before the
1086    * current thread can and returning the guard to the unsatisfied state. In the latter case the
1087    * other thread (last thread modifying the state protected by the monitor) takes over the
1088    * responsibility of signalling the next waiter.
1089    *
1090    * <p>This method must not be called from within a beginWaitingFor/endWaitingFor block, or else
1091    * the current thread's guard might be mistakenly signalled, leading to a lost signal.
1092    */
1093   @GuardedBy("lock")
1094   private void signalNextWaiter() {
1095     for (Guard guard = activeGuards; guard != null; guard = guard.next) {
1096       if (isSatisfied(guard)) {
1097         guard.condition.signal();
1098         break;
1099       }
1100     }
1101   }
1102 
1103   /**
1104    * Exactly like signalNextWaiter, but caller guarantees that guardToSkip need not be considered,
1105    * because caller has previously checked that guardToSkip.isSatisfied() returned false. An
1106    * optimization for the case that guardToSkip.isSatisfied() may be expensive.
1107    *
1108    * <p>We decided against using this method, since in practice, isSatisfied() is likely to be very
1109    * cheap (typically one field read). Resurrect this method if you find that not to be true.
1110    */
1111   //   @GuardedBy("lock")
1112   //   private void signalNextWaiterSkipping(Guard guardToSkip) {
1113   //     for (Guard guard = activeGuards; guard != null; guard = guard.next) {
1114   //       if (guard != guardToSkip && isSatisfied(guard)) {
1115   //         guard.condition.signal();
1116   //         break;
1117   //       }
1118   //     }
1119   //   }
1120 
1121   /**
1122    * Exactly like guard.isSatisfied(), but in addition signals all waiting threads in the (hopefully
1123    * unlikely) event that isSatisfied() throws.
1124    */
1125   @GuardedBy("lock")
1126   private boolean isSatisfied(Guard guard) {
1127     try {
1128       return guard.isSatisfied();
1129     } catch (Throwable throwable) {
1130       // Any Exception is either a RuntimeException or sneaky checked exception.
1131       signalAllWaiters();
1132       throw throwable;
1133     }
1134   }
1135 
1136   /** Signals all threads waiting on guards. */
1137   @GuardedBy("lock")
1138   private void signalAllWaiters() {
1139     for (Guard guard = activeGuards; guard != null; guard = guard.next) {
1140       guard.condition.signalAll();
1141     }
1142   }
1143 
1144   /** Records that the current thread is about to wait on the specified guard. */
1145   @GuardedBy("lock")
1146   private void beginWaitingFor(Guard guard) {
1147     int waiters = guard.waiterCount++;
1148     if (waiters == 0) {
1149       // push guard onto activeGuards
1150       guard.next = activeGuards;
1151       activeGuards = guard;
1152     }
1153   }
1154 
1155   /** Records that the current thread is no longer waiting on the specified guard. */
1156   @GuardedBy("lock")
1157   private void endWaitingFor(Guard guard) {
1158     int waiters = --guard.waiterCount;
1159     if (waiters == 0) {
1160       // unlink guard from activeGuards
1161       for (Guard p = activeGuards, pred = null; ; pred = p, p = p.next) {
1162         if (p == guard) {
1163           if (pred == null) {
1164             activeGuards = p.next;
1165           } else {
1166             pred.next = p.next;
1167           }
1168           p.next = null; // help GC
1169           break;
1170         }
1171       }
1172     }
1173   }
1174 
1175   /*
1176    * Methods that loop waiting on a guard's condition until the guard is satisfied, while recording
1177    * this fact so that other threads know to check our guard and signal us. It's caller's
1178    * responsibility to ensure that the guard is *not* currently satisfied.
1179    */
1180 
1181   @GuardedBy("lock")
1182   private void await(Guard guard, boolean signalBeforeWaiting) throws InterruptedException {
1183     if (signalBeforeWaiting) {
1184       signalNextWaiter();
1185     }
1186     beginWaitingFor(guard);
1187     try {
1188       do {
1189         guard.condition.await();
1190       } while (!guard.isSatisfied());
1191     } finally {
1192       endWaitingFor(guard);
1193     }
1194   }
1195 
1196   @GuardedBy("lock")
1197   private void awaitUninterruptibly(Guard guard, boolean signalBeforeWaiting) {
1198     if (signalBeforeWaiting) {
1199       signalNextWaiter();
1200     }
1201     beginWaitingFor(guard);
1202     try {
1203       do {
1204         guard.condition.awaitUninterruptibly();
1205       } while (!guard.isSatisfied());
1206     } finally {
1207       endWaitingFor(guard);
1208     }
1209   }
1210 
1211   /** Caller should check before calling that guard is not satisfied. */
1212   @GuardedBy("lock")
1213   private boolean awaitNanos(Guard guard, long nanos, boolean signalBeforeWaiting)
1214       throws InterruptedException {
1215     boolean firstTime = true;
1216     try {
1217       do {
1218         if (nanos <= 0L) {
1219           return false;
1220         }
1221         if (firstTime) {
1222           if (signalBeforeWaiting) {
1223             signalNextWaiter();
1224           }
1225           beginWaitingFor(guard);
1226           firstTime = false;
1227         }
1228         nanos = guard.condition.awaitNanos(nanos);
1229       } while (!guard.isSatisfied());
1230       return true;
1231     } finally {
1232       if (!firstTime) {
1233         endWaitingFor(guard);
1234       }
1235     }
1236   }
1237 }
1238