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; 018import static com.google.common.util.concurrent.Internal.toNanosSaturated; 019 020import com.google.common.annotations.GwtIncompatible; 021import com.google.common.annotations.J2ktIncompatible; 022import com.google.common.primitives.Longs; 023import com.google.errorprone.annotations.concurrent.GuardedBy; 024import com.google.j2objc.annotations.Weak; 025import java.time.Duration; 026import java.util.concurrent.TimeUnit; 027import java.util.concurrent.locks.Condition; 028import java.util.concurrent.locks.ReentrantLock; 029import java.util.function.BooleanSupplier; 030import javax.annotation.CheckForNull; 031 032/** 033 * A synchronization abstraction supporting waiting on arbitrary boolean conditions. 034 * 035 * <p>This class is intended as a replacement for {@link ReentrantLock}. Code using {@code Monitor} 036 * is less error-prone and more readable than code using {@code ReentrantLock}, without significant 037 * performance loss. {@code Monitor} even has the potential for performance gain by optimizing the 038 * evaluation and signaling of conditions. Signaling is entirely <a 039 * href="http://en.wikipedia.org/wiki/Monitor_(synchronization)#Implicit_signaling">implicit</a>. By 040 * eliminating explicit signaling, this class can guarantee that only one thread is awakened when a 041 * condition becomes true (no "signaling storms" due to use of {@link 042 * java.util.concurrent.locks.Condition#signalAll Condition.signalAll}) and that no signals are lost 043 * (no "hangs" due to incorrect use of {@link java.util.concurrent.locks.Condition#signal 044 * Condition.signal}). 045 * 046 * <p>A thread is said to <i>occupy</i> a monitor if it has <i>entered</i> the monitor but not yet 047 * <i>left</i>. Only one thread may occupy a given monitor at any moment. A monitor is also 048 * reentrant, so a thread may enter a monitor any number of times, and then must leave the same 049 * number of times. The <i>enter</i> and <i>leave</i> operations have the same synchronization 050 * semantics as the built-in Java language synchronization primitives. 051 * 052 * <p>A call to any of the <i>enter</i> methods with <b>void</b> return type should always be 053 * followed immediately by a <i>try/finally</i> block to ensure that the current thread leaves the 054 * monitor cleanly: 055 * 056 * <pre>{@code 057 * monitor.enter(); 058 * try { 059 * // do things while occupying the monitor 060 * } finally { 061 * monitor.leave(); 062 * } 063 * }</pre> 064 * 065 * <p>A call to any of the <i>enter</i> methods with <b>boolean</b> return type should always appear 066 * as the condition of an <i>if</i> statement containing a <i>try/finally</i> block to ensure that 067 * the current thread leaves the monitor cleanly: 068 * 069 * <pre>{@code 070 * if (monitor.tryEnter()) { 071 * try { 072 * // do things while occupying the monitor 073 * } finally { 074 * monitor.leave(); 075 * } 076 * } else { 077 * // do other things since the monitor was not available 078 * } 079 * }</pre> 080 * 081 * <h2>Comparison with {@code synchronized} and {@code ReentrantLock}</h2> 082 * 083 * <p>The following examples show a simple threadsafe holder expressed using {@code synchronized}, 084 * {@link ReentrantLock}, and {@code Monitor}. 085 * 086 * <h3>{@code synchronized}</h3> 087 * 088 * <p>This version is the fewest lines of code, largely because the synchronization mechanism used 089 * is built into the language and runtime. But the programmer has to remember to avoid a couple of 090 * common bugs: The {@code wait()} must be inside a {@code while} instead of an {@code if}, and 091 * {@code notifyAll()} must be used instead of {@code notify()} because there are two different 092 * logical conditions being awaited. 093 * 094 * <pre>{@code 095 * public class SafeBox<V> { 096 * private V value; 097 * 098 * public synchronized V get() throws InterruptedException { 099 * 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 207public 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 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 */ 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 */ 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 */ 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 */ 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}