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