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