(锁) 系列篇
目录 |
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 /* 26 * This file is available under and governed by the GNU General Public 27 * License version 2 only, as published by the Free Software Foundation. 28 * However, the following notice accompanied the original version of this 29 * file: 30 * 31 * Written by Doug Lea with assistance from members of JCP JSR-166 32 * Expert Group and released to the public domain, as explained at 33 * http://creativecommons.org/publicdomain/zero/1.0/ 34 */ 35 36 package java.util.concurrent.locks; 37 import java.util.concurrent.TimeUnit; 38 import java.util.Collection; 39 40 /** 41 * A reentrant mutual exclusion {@link Lock} with the same basic 42 * behavior and semantics as the implicit monitor lock accessed using 43 * {@code synchronized} methods and statements, but with extended 44 * capabilities. 45 * 46 * <p>A {@code ReentrantLock} is <em>owned</em> by the thread last 47 * successfully locking, but not yet unlocking it. A thread invoking 48 * {@code lock} will return, successfully acquiring the lock, when 49 * the lock is not owned by another thread. The method will return 50 * immediately if the current thread already owns the lock. This can 51 * be checked using methods {@link #isHeldByCurrentThread}, and {@link 52 * #getHoldCount}. 53 * 54 * <p>The constructor for this class accepts an optional 55 * <em>fairness</em> parameter. When set {@code true}, under 56 * contention, locks favor granting access to the longest-waiting 57 * thread. Otherwise this lock does not guarantee any particular 58 * access order. Programs using fair locks accessed by many threads 59 * may display lower overall throughput (i.e., are slower; often much 60 * slower) than those using the default setting, but have smaller 61 * variances in times to obtain locks and guarantee lack of 62 * starvation. Note however, that fairness of locks does not guarantee 63 * fairness of thread scheduling. Thus, one of many threads using a 64 * fair lock may obtain it multiple times in succession while other 65 * active threads are not progressing and not currently holding the 66 * lock. 67 * Also note that the untimed {@link #tryLock()} method does not 68 * honor the fairness setting. It will succeed if the lock 69 * is available even if other threads are waiting. 70 * 71 * <p>It is recommended practice to <em>always</em> immediately 72 * follow a call to {@code lock} with a {@code try} block, most 73 * typically in a before/after construction such as: 74 * 75 * <pre> {@code 76 * class X { 77 * private final ReentrantLock lock = new ReentrantLock(); 78 * // ... 79 * 80 * public void m() { 81 * lock.lock(); // block until condition holds 82 * try { 83 * // ... method body 84 * } finally { 85 * lock.unlock() 86 * } 87 * } 88 * }}</pre> 89 * 90 * <p>In addition to implementing the {@link Lock} interface, this 91 * class defines a number of {@code public} and {@code protected} 92 * methods for inspecting the state of the lock. Some of these 93 * methods are only useful for instrumentation and monitoring. 94 * 95 * <p>Serialization of this class behaves in the same way as built-in 96 * locks: a deserialized lock is in the unlocked state, regardless of 97 * its state when serialized. 98 * 99 * <p>This lock supports a maximum of 2147483647 recursive locks by 100 * the same thread. Attempts to exceed this limit result in 101 * {@link Error} throws from locking methods. 102 * 103 * @since 1.5 104 * @author Doug Lea 105 */ 106 public class ReentrantLock implements Lock, java.io.Serializable { 107 private static final long serialVersionUID = 7373984872572414699L; 108 /** Synchronizer providing all implementation mechanics */ 109 private final Sync sync; 110 111 /** 112 * Base of synchronization control for this lock. Subclassed 113 * into fair and nonfair versions below. Uses AQS state to 114 * represent the number of holds on the lock. 115 */ 116 abstract static class Sync extends AbstractQueuedSynchronizer { 117 private static final long serialVersionUID = -5179523762034025860L; 118 119 /** 120 * Performs {@link Lock#lock}. The main reason for subclassing 121 * is to allow fast path for nonfair version. 122 */ 123 abstract void lock(); 124 125 /** 126 * Performs non-fair tryLock. tryAcquire is implemented in 127 * subclasses, but both need nonfair try for trylock method. 128 */ 129 final boolean nonfairTryAcquire(int acquires) { 130 final Thread current = Thread.currentThread(); 131 int c = getState(); 132 if (c == 0) { 133 if (compareAndSetState(0, acquires)) { 134 setExclusiveOwnerThread(current); 135 return true; 136 } 137 } 138 else if (current == getExclusiveOwnerThread()) { 139 int nextc = c + acquires; 140 if (nextc < 0) // overflow 141 throw new Error("Maximum lock count exceeded"); 142 setState(nextc); 143 return true; 144 } 145 return false; 146 } 147 148 protected final boolean tryRelease(int releases) { 149 int c = getState() - releases; 150 if (Thread.currentThread() != getExclusiveOwnerThread()) 151 throw new IllegalMonitorStateException(); 152 boolean free = false; 153 if (c == 0) { 154 free = true; 155 setExclusiveOwnerThread(null); 156 } 157 setState(c); 158 return free; 159 } 160 161 protected final boolean isHeldExclusively() { 162 // While we must in general read state before owner, 163 // we don't need to do so to check if current thread is owner 164 return getExclusiveOwnerThread() == Thread.currentThread(); 165 } 166 167 final ConditionObject newCondition() { 168 return new ConditionObject(); 169 } 170 171 // Methods relayed from outer class 172 173 final Thread getOwner() { 174 return getState() == 0 ? null : getExclusiveOwnerThread(); 175 } 176 177 final int getHoldCount() { 178 return isHeldExclusively() ? getState() : 0; 179 } 180 181 final boolean isLocked() { 182 return getState() != 0; 183 } 184 185 /** 186 * Reconstitutes the instance from a stream (that is, deserializes it). 187 */ 188 private void readObject(java.io.ObjectInputStream s) 189 throws java.io.IOException, ClassNotFoundException { 190 s.defaultReadObject(); 191 setState(0); // reset to unlocked state 192 } 193 } 194 195 /** 196 * Sync object for non-fair locks 197 */ 198 static final class NonfairSync extends Sync { 199 private static final long serialVersionUID = 7316153563782823691L; 200 201 /** 202 * Performs lock. Try immediate barge, backing up to normal 203 * acquire on failure. 204 */ 205 final void lock() { 206 if (compareAndSetState(0, 1)) 207 setExclusiveOwnerThread(Thread.currentThread()); 208 else 209 acquire(1); 210 } 211 212 protected final boolean tryAcquire(int acquires) { 213 return nonfairTryAcquire(acquires); 214 } 215 } 216 217 /** 218 * Sync object for fair locks 219 */ 220 static final class FairSync extends Sync { 221 private static final long serialVersionUID = -3000897897090466540L; 222 223 final void lock() { 224 acquire(1); 225 } 226 227 /** 228 * Fair version of tryAcquire. Don't grant access unless 229 * recursive call or no waiters or is first. 230 */ 231 protected final boolean tryAcquire(int acquires) { 232 final Thread current = Thread.currentThread(); 233 int c = getState(); 234 if (c == 0) { 235 if (!hasQueuedPredecessors() && 236 compareAndSetState(0, acquires)) { 237 setExclusiveOwnerThread(current); 238 return true; 239 } 240 } 241 else if (current == getExclusiveOwnerThread()) { 242 int nextc = c + acquires; 243 if (nextc < 0) 244 throw new Error("Maximum lock count exceeded"); 245 setState(nextc); 246 return true; 247 } 248 return false; 249 } 250 } 251 252 /** 253 * Creates an instance of {@code ReentrantLock}. 254 * This is equivalent to using {@code ReentrantLock(false)}. 255 */ 256 public ReentrantLock() { 257 sync = new NonfairSync(); 258 } 259 260 /** 261 * Creates an instance of {@code ReentrantLock} with the 262 * given fairness policy. 263 * 264 * @param fair {@code true} if this lock should use a fair ordering policy 265 */ 266 public ReentrantLock(boolean fair) { 267 sync = fair ? new FairSync() : new NonfairSync(); 268 } 269 270 /** 271 * Acquires the lock. 272 * 273 * <p>Acquires the lock if it is not held by another thread and returns 274 * immediately, setting the lock hold count to one. 275 * 276 * <p>If the current thread already holds the lock then the hold 277 * count is incremented by one and the method returns immediately. 278 * 279 * <p>If the lock is held by another thread then the 280 * current thread becomes disabled for thread scheduling 281 * purposes and lies dormant until the lock has been acquired, 282 * at which time the lock hold count is set to one. 283 */ 284 public void lock() { 285 sync.lock(); 286 } 287 288 /** 289 * Acquires the lock unless the current thread is 290 * {@linkplain Thread#interrupt interrupted}. 291 * 292 * <p>Acquires the lock if it is not held by another thread and returns 293 * immediately, setting the lock hold count to one. 294 * 295 * <p>If the current thread already holds this lock then the hold count 296 * is incremented by one and the method returns immediately. 297 * 298 * <p>If the lock is held by another thread then the 299 * current thread becomes disabled for thread scheduling 300 * purposes and lies dormant until one of two things happens: 301 * 302 * <ul> 303 * 304 * <li>The lock is acquired by the current thread; or 305 * 306 * <li>Some other thread {@linkplain Thread#interrupt interrupts} the 307 * current thread. 308 * 309 * </ul> 310 * 311 * <p>If the lock is acquired by the current thread then the lock hold 312 * count is set to one. 313 * 314 * <p>If the current thread: 315 * 316 * <ul> 317 * 318 * <li>has its interrupted status set on entry to this method; or 319 * 320 * <li>is {@linkplain Thread#interrupt interrupted} while acquiring 321 * the lock, 322 * 323 * </ul> 324 * 325 * then {@link InterruptedException} is thrown and the current thread's 326 * interrupted status is cleared. 327 * 328 * <p>In this implementation, as this method is an explicit 329 * interruption point, preference is given to responding to the 330 * interrupt over normal or reentrant acquisition of the lock. 331 * 332 * @throws InterruptedException if the current thread is interrupted 333 */ 334 public void lockInterruptibly() throws InterruptedException { 335 sync.acquireInterruptibly(1); 336 } 337 338 /** 339 * Acquires the lock only if it is not held by another thread at the time 340 * of invocation. 341 * 342 * <p>Acquires the lock if it is not held by another thread and 343 * returns immediately with the value {@code true}, setting the 344 * lock hold count to one. Even when this lock has been set to use a 345 * fair ordering policy, a call to {@code tryLock()} <em>will</em> 346 * immediately acquire the lock if it is available, whether or not 347 * other threads are currently waiting for the lock. 348 * This "barging" behavior can be useful in certain 349 * circumstances, even though it breaks fairness. If you want to honor 350 * the fairness setting for this lock, then use 351 * {@link #tryLock(long, TimeUnit) tryLock(0, TimeUnit.SECONDS) } 352 * which is almost equivalent (it also detects interruption). 353 * 354 * <p>If the current thread already holds this lock then the hold 355 * count is incremented by one and the method returns {@code true}. 356 * 357 * <p>If the lock is held by another thread then this method will return 358 * immediately with the value {@code false}. 359 * 360 * @return {@code true} if the lock was free and was acquired by the 361 * current thread, or the lock was already held by the current 362 * thread; and {@code false} otherwise 363 */ 364 public boolean tryLock() { 365 return sync.nonfairTryAcquire(1); 366 } 367 368 /** 369 * Acquires the lock if it is not held by another thread within the given 370 * waiting time and the current thread has not been 371 * {@linkplain Thread#interrupt interrupted}. 372 * 373 * <p>Acquires the lock if it is not held by another thread and returns 374 * immediately with the value {@code true}, setting the lock hold count 375 * to one. If this lock has been set to use a fair ordering policy then 376 * an available lock <em>will not</em> be acquired if any other threads 377 * are waiting for the lock. This is in contrast to the {@link #tryLock()} 378 * method. If you want a timed {@code tryLock} that does permit barging on 379 * a fair lock then combine the timed and un-timed forms together: 380 * 381 * <pre> {@code 382 * if (lock.tryLock() || 383 * lock.tryLock(timeout, unit)) { 384 * ... 385 * }}</pre> 386 * 387 * <p>If the current thread 388 * already holds this lock then the hold count is incremented by one and 389 * the method returns {@code true}. 390 * 391 * <p>If the lock is held by another thread then the 392 * current thread becomes disabled for thread scheduling 393 * purposes and lies dormant until one of three things happens: 394 * 395 * <ul> 396 * 397 * <li>The lock is acquired by the current thread; or 398 * 399 * <li>Some other thread {@linkplain Thread#interrupt interrupts} 400 * the current thread; or 401 * 402 * <li>The specified waiting time elapses 403 * 404 * </ul> 405 * 406 * <p>If the lock is acquired then the value {@code true} is returned and 407 * the lock hold count is set to one. 408 * 409 * <p>If the current thread: 410 * 411 * <ul> 412 * 413 * <li>has its interrupted status set on entry to this method; or 414 * 415 * <li>is {@linkplain Thread#interrupt interrupted} while 416 * acquiring the lock, 417 * 418 * </ul> 419 * then {@link InterruptedException} is thrown and the current thread's 420 * interrupted status is cleared. 421 * 422 * <p>If the specified waiting time elapses then the value {@code false} 423 * is returned. If the time is less than or equal to zero, the method 424 * will not wait at all. 425 * 426 * <p>In this implementation, as this method is an explicit 427 * interruption point, preference is given to responding to the 428 * interrupt over normal or reentrant acquisition of the lock, and 429 * over reporting the elapse of the waiting time. 430 * 431 * @param timeout the time to wait for the lock 432 * @param unit the time unit of the timeout argument 433 * @return {@code true} if the lock was free and was acquired by the 434 * current thread, or the lock was already held by the current 435 * thread; and {@code false} if the waiting time elapsed before 436 * the lock could be acquired 437 * @throws InterruptedException if the current thread is interrupted 438 * @throws NullPointerException if the time unit is null 439 */ 440 public boolean tryLock(long timeout, TimeUnit unit) 441 throws InterruptedException { 442 return sync.tryAcquireNanos(1, unit.toNanos(timeout)); 443 } 444 445 /** 446 * Attempts to release this lock. 447 * 448 * <p>If the current thread is the holder of this lock then the hold 449 * count is decremented. If the hold count is now zero then the lock 450 * is released. If the current thread is not the holder of this 451 * lock then {@link IllegalMonitorStateException} is thrown. 452 * 453 * @throws IllegalMonitorStateException if the current thread does not 454 * hold this lock 455 */ 456 public void unlock() { 457 sync.release(1); 458 } 459 460 /** 461 * Returns a {@link Condition} instance for use with this 462 * {@link Lock} instance. 463 * 464 * <p>The returned {@link Condition} instance supports the same 465 * usages as do the {@link Object} monitor methods ({@link 466 * Object#wait() wait}, {@link Object#notify notify}, and {@link 467 * Object#notifyAll notifyAll}) when used with the built-in 468 * monitor lock. 469 * 470 * <ul> 471 * 472 * <li>If this lock is not held when any of the {@link Condition} 473 * {@linkplain Condition#await() waiting} or {@linkplain 474 * Condition#signal signalling} methods are called, then an {@link 475 * IllegalMonitorStateException} is thrown. 476 * 477 * <li>When the condition {@linkplain Condition#await() waiting} 478 * methods are called the lock is released and, before they 479 * return, the lock is reacquired and the lock hold count restored 480 * to what it was when the method was called. 481 * 482 * <li>If a thread is {@linkplain Thread#interrupt interrupted} 483 * while waiting then the wait will terminate, an {@link 484 * InterruptedException} will be thrown, and the thread's 485 * interrupted status will be cleared. 486 * 487 * <li> Waiting threads are signalled in FIFO order. 488 * 489 * <li>The ordering of lock reacquisition for threads returning 490 * from waiting methods is the same as for threads initially 491 * acquiring the lock, which is in the default case not specified, 492 * but for <em>fair</em> locks favors those threads that have been 493 * waiting the longest. 494 * 495 * </ul> 496 * 497 * @return the Condition object 498 */ 499 public Condition newCondition() { 500 return sync.newCondition(); 501 } 502 503 /** 504 * Queries the number of holds on this lock by the current thread. 505 * 506 * <p>A thread has a hold on a lock for each lock action that is not 507 * matched by an unlock action. 508 * 509 * <p>The hold count information is typically only used for testing and 510 * debugging purposes. For example, if a certain section of code should 511 * not be entered with the lock already held then we can assert that 512 * fact: 513 * 514 * <pre> {@code 515 * class X { 516 * ReentrantLock lock = new ReentrantLock(); 517 * // ... 518 * public void m() { 519 * assert lock.getHoldCount() == 0; 520 * lock.lock(); 521 * try { 522 * // ... method body 523 * } finally { 524 * lock.unlock(); 525 * } 526 * } 527 * }}</pre> 528 * 529 * @return the number of holds on this lock by the current thread, 530 * or zero if this lock is not held by the current thread 531 */ 532 public int getHoldCount() { 533 return sync.getHoldCount(); 534 } 535 536 /** 537 * Queries if this lock is held by the current thread. 538 * 539 * <p>Analogous to the {@link Thread#holdsLock(Object)} method for 540 * built-in monitor locks, this method is typically used for 541 * debugging and testing. For example, a method that should only be 542 * called while a lock is held can assert that this is the case: 543 * 544 * <pre> {@code 545 * class X { 546 * ReentrantLock lock = new ReentrantLock(); 547 * // ... 548 * 549 * public void m() { 550 * assert lock.isHeldByCurrentThread(); 551 * // ... method body 552 * } 553 * }}</pre> 554 * 555 * <p>It can also be used to ensure that a reentrant lock is used 556 * in a non-reentrant manner, for example: 557 * 558 * <pre> {@code 559 * class X { 560 * ReentrantLock lock = new ReentrantLock(); 561 * // ... 562 * 563 * public void m() { 564 * assert !lock.isHeldByCurrentThread(); 565 * lock.lock(); 566 * try { 567 * // ... method body 568 * } finally { 569 * lock.unlock(); 570 * } 571 * } 572 * }}</pre> 573 * 574 * @return {@code true} if current thread holds this lock and 575 * {@code false} otherwise 576 */ 577 public boolean isHeldByCurrentThread() { 578 return sync.isHeldExclusively(); 579 } 580 581 /** 582 * Queries if this lock is held by any thread. This method is 583 * designed for use in monitoring of the system state, 584 * not for synchronization control. 585 * 586 * @return {@code true} if any thread holds this lock and 587 * {@code false} otherwise 588 */ 589 public boolean isLocked() { 590 return sync.isLocked(); 591 } 592 593 /** 594 * Returns {@code true} if this lock has fairness set true. 595 * 596 * @return {@code true} if this lock has fairness set true 597 */ 598 public final boolean isFair() { 599 return sync instanceof FairSync; 600 } 601 602 /** 603 * Returns the thread that currently owns this lock, or 604 * {@code null} if not owned. When this method is called by a 605 * thread that is not the owner, the return value reflects a 606 * best-effort approximation of current lock status. For example, 607 * the owner may be momentarily {@code null} even if there are 608 * threads trying to acquire the lock but have not yet done so. 609 * This method is designed to facilitate construction of 610 * subclasses that provide more extensive lock monitoring 611 * facilities. 612 * 613 * @return the owner, or {@code null} if not owned 614 */ 615 protected Thread getOwner() { 616 return sync.getOwner(); 617 } 618 619 /** 620 * Queries whether any threads are waiting to acquire this lock. Note that 621 * because cancellations may occur at any time, a {@code true} 622 * return does not guarantee that any other thread will ever 623 * acquire this lock. This method is designed primarily for use in 624 * monitoring of the system state. 625 * 626 * @return {@code true} if there may be other threads waiting to 627 * acquire the lock 628 */ 629 public final boolean hasQueuedThreads() { 630 return sync.hasQueuedThreads(); 631 } 632 633 /** 634 * Queries whether the given thread is waiting to acquire this 635 * lock. Note that because cancellations may occur at any time, a 636 * {@code true} return does not guarantee that this thread 637 * will ever acquire this lock. This method is designed primarily for use 638 * in monitoring of the system state. 639 * 640 * @param thread the thread 641 * @return {@code true} if the given thread is queued waiting for this lock 642 * @throws NullPointerException if the thread is null 643 */ 644 public final boolean hasQueuedThread(Thread thread) { 645 return sync.isQueued(thread); 646 } 647 648 /** 649 * Returns an estimate of the number of threads waiting to 650 * acquire this lock. The value is only an estimate because the number of 651 * threads may change dynamically while this method traverses 652 * internal data structures. This method is designed for use in 653 * monitoring of the system state, not for synchronization 654 * control. 655 * 656 * @return the estimated number of threads waiting for this lock 657 */ 658 public final int getQueueLength() { 659 return sync.getQueueLength(); 660 } 661 662 /** 663 * Returns a collection containing threads that may be waiting to 664 * acquire this lock. Because the actual set of threads may change 665 * dynamically while constructing this result, the returned 666 * collection is only a best-effort estimate. The elements of the 667 * returned collection are in no particular order. This method is 668 * designed to facilitate construction of subclasses that provide 669 * more extensive monitoring facilities. 670 * 671 * @return the collection of threads 672 */ 673 protected Collection<Thread> getQueuedThreads() { 674 return sync.getQueuedThreads(); 675 } 676 677 /** 678 * Queries whether any threads are waiting on the given condition 679 * associated with this lock. Note that because timeouts and 680 * interrupts may occur at any time, a {@code true} return does 681 * not guarantee that a future {@code signal} will awaken any 682 * threads. This method is designed primarily for use in 683 * monitoring of the system state. 684 * 685 * @param condition the condition 686 * @return {@code true} if there are any waiting threads 687 * @throws IllegalMonitorStateException if this lock is not held 688 * @throws IllegalArgumentException if the given condition is 689 * not associated with this lock 690 * @throws NullPointerException if the condition is null 691 */ 692 public boolean hasWaiters(Condition condition) { 693 if (condition == null) 694 throw new NullPointerException(); 695 if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject)) 696 throw new IllegalArgumentException("not owner"); 697 return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition); 698 } 699 700 /** 701 * Returns an estimate of the number of threads waiting on the 702 * given condition associated with this lock. Note that because 703 * timeouts and interrupts may occur at any time, the estimate 704 * serves only as an upper bound on the actual number of waiters. 705 * This method is designed for use in monitoring of the system 706 * state, not for synchronization control. 707 * 708 * @param condition the condition 709 * @return the estimated number of waiting threads 710 * @throws IllegalMonitorStateException if this lock is not held 711 * @throws IllegalArgumentException if the given condition is 712 * not associated with this lock 713 * @throws NullPointerException if the condition is null 714 */ 715 public int getWaitQueueLength(Condition condition) { 716 if (condition == null) 717 throw new NullPointerException(); 718 if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject)) 719 throw new IllegalArgumentException("not owner"); 720 return sync.getWaitQueueLength((AbstractQueuedSynchronizer.ConditionObject)condition); 721 } 722 723 /** 724 * Returns a collection containing those threads that may be 725 * waiting on the given condition associated with this lock. 726 * Because the actual set of threads may change dynamically while 727 * constructing this result, the returned collection is only a 728 * best-effort estimate. The elements of the returned collection 729 * are in no particular order. This method is designed to 730 * facilitate construction of subclasses that provide more 731 * extensive condition monitoring facilities. 732 * 733 * @param condition the condition 734 * @return the collection of threads 735 * @throws IllegalMonitorStateException if this lock is not held 736 * @throws IllegalArgumentException if the given condition is 737 * not associated with this lock 738 * @throws NullPointerException if the condition is null 739 */ 740 protected Collection<Thread> getWaitingThreads(Condition condition) { 741 if (condition == null) 742 throw new NullPointerException(); 743 if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject)) 744 throw new IllegalArgumentException("not owner"); 745 return sync.getWaitingThreads((AbstractQueuedSynchronizer.ConditionObject)condition); 746 } 747 748 /** 749 * Returns a string identifying this lock, as well as its lock state. 750 * The state, in brackets, includes either the String {@code "Unlocked"} 751 * or the String {@code "Locked by"} followed by the 752 * {@linkplain Thread#getName name} of the owning thread. 753 * 754 * @return a string identifying this lock, as well as its lock state 755 */ 756 public String toString() { 757 Thread o = sync.getOwner(); 758 return super.toString() + ((o == null) ? 759 "[Unlocked]" : 760 "[Locked by thread " + o.getName() + "]"); 761 } 762 }
1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 /* 26 * This file is available under and governed by the GNU General Public 27 * License version 2 only, as published by the Free Software Foundation. 28 * However, the following notice accompanied the original version of this 29 * file: 30 * 31 * Written by Doug Lea with assistance from members of JCP JSR-166 32 * Expert Group and released to the public domain, as explained at 33 * http://creativecommons.org/publicdomain/zero/1.0/ 34 */ 35 36 package java.util.concurrent.locks; 37 import java.util.concurrent.TimeUnit; 38 import java.util.ArrayList; 39 import java.util.Collection; 40 import java.util.Date; 41 import sun.misc.Unsafe; 42 43 /** 44 * Provides a framework for implementing blocking locks and related 45 * synchronizers (semaphores, events, etc) that rely on 46 * first-in-first-out (FIFO) wait queues. This class is designed to 47 * be a useful basis for most kinds of synchronizers that rely on a 48 * single atomic {@code int} value to represent state. Subclasses 49 * must define the protected methods that change this state, and which 50 * define what that state means in terms of this object being acquired 51 * or released. Given these, the other methods in this class carry 52 * out all queuing and blocking mechanics. Subclasses can maintain 53 * other state fields, but only the atomically updated {@code int} 54 * value manipulated using methods {@link #getState}, {@link 55 * #setState} and {@link #compareAndSetState} is tracked with respect 56 * to synchronization. 57 * 58 * <p>Subclasses should be defined as non-public internal helper 59 * classes that are used to implement the synchronization properties 60 * of their enclosing class. Class 61 * {@code AbstractQueuedSynchronizer} does not implement any 62 * synchronization interface. Instead it defines methods such as 63 * {@link #acquireInterruptibly} that can be invoked as 64 * appropriate by concrete locks and related synchronizers to 65 * implement their public methods. 66 * 67 * <p>This class supports either or both a default <em>exclusive</em> 68 * mode and a <em>shared</em> mode. When acquired in exclusive mode, 69 * attempted acquires by other threads cannot succeed. Shared mode 70 * acquires by multiple threads may (but need not) succeed. This class 71 * does not "understand" these differences except in the 72 * mechanical sense that when a shared mode acquire succeeds, the next 73 * waiting thread (if one exists) must also determine whether it can 74 * acquire as well. Threads waiting in the different modes share the 75 * same FIFO queue. Usually, implementation subclasses support only 76 * one of these modes, but both can come into play for example in a 77 * {@link ReadWriteLock}. Subclasses that support only exclusive or 78 * only shared modes need not define the methods supporting the unused mode. 79 * 80 * <p>This class defines a nested {@link ConditionObject} class that 81 * can be used as a {@link Condition} implementation by subclasses 82 * supporting exclusive mode for which method {@link 83 * #isHeldExclusively} reports whether synchronization is exclusively 84 * held with respect to the current thread, method {@link #release} 85 * invoked with the current {@link #getState} value fully releases 86 * this object, and {@link #acquire}, given this saved state value, 87 * eventually restores this object to its previous acquired state. No 88 * {@code AbstractQueuedSynchronizer} method otherwise creates such a 89 * condition, so if this constraint cannot be met, do not use it. The 90 * behavior of {@link ConditionObject} depends of course on the 91 * semantics of its synchronizer implementation. 92 * 93 * <p>This class provides inspection, instrumentation, and monitoring 94 * methods for the internal queue, as well as similar methods for 95 * condition objects. These can be exported as desired into classes 96 * using an {@code AbstractQueuedSynchronizer} for their 97 * synchronization mechanics. 98 * 99 * <p>Serialization of this class stores only the underlying atomic 100 * integer maintaining state, so deserialized objects have empty 101 * thread queues. Typical subclasses requiring serializability will 102 * define a {@code readObject} method that restores this to a known 103 * initial state upon deserialization. 104 * 105 * <h3>Usage</h3> 106 * 107 * <p>To use this class as the basis of a synchronizer, redefine the 108 * following methods, as applicable, by inspecting and/or modifying 109 * the synchronization state using {@link #getState}, {@link 110 * #setState} and/or {@link #compareAndSetState}: 111 * 112 * <ul> 113 * <li> {@link #tryAcquire} 114 * <li> {@link #tryRelease} 115 * <li> {@link #tryAcquireShared} 116 * <li> {@link #tryReleaseShared} 117 * <li> {@link #isHeldExclusively} 118 * </ul> 119 * 120 * Each of these methods by default throws {@link 121 * UnsupportedOperationException}. Implementations of these methods 122 * must be internally thread-safe, and should in general be short and 123 * not block. Defining these methods is the <em>only</em> supported 124 * means of using this class. All other methods are declared 125 * {@code final} because they cannot be independently varied. 126 * 127 * <p>You may also find the inherited methods from {@link 128 * AbstractOwnableSynchronizer} useful to keep track of the thread 129 * owning an exclusive synchronizer. You are encouraged to use them 130 * -- this enables monitoring and diagnostic tools to assist users in 131 * determining which threads hold locks. 132 * 133 * <p>Even though this class is based on an internal FIFO queue, it 134 * does not automatically enforce FIFO acquisition policies. The core 135 * of exclusive synchronization takes the form: 136 * 137 * <pre> 138 * Acquire: 139 * while (!tryAcquire(arg)) { 140 * <em>enqueue thread if it is not already queued</em>; 141 * <em>possibly block current thread</em>; 142 * } 143 * 144 * Release: 145 * if (tryRelease(arg)) 146 * <em>unblock the first queued thread</em>; 147 * </pre> 148 * 149 * (Shared mode is similar but may involve cascading signals.) 150 * 151 * <p id="barging">Because checks in acquire are invoked before 152 * enqueuing, a newly acquiring thread may <em>barge</em> ahead of 153 * others that are blocked and queued. However, you can, if desired, 154 * define {@code tryAcquire} and/or {@code tryAcquireShared} to 155 * disable barging by internally invoking one or more of the inspection 156 * methods, thereby providing a <em>fair</em> FIFO acquisition order. 157 * In particular, most fair synchronizers can define {@code tryAcquire} 158 * to return {@code false} if {@link #hasQueuedPredecessors} (a method 159 * specifically designed to be used by fair synchronizers) returns 160 * {@code true}. Other variations are possible. 161 * 162 * <p>Throughput and scalability are generally highest for the 163 * default barging (also known as <em>greedy</em>, 164 * <em>renouncement</em>, and <em>convoy-avoidance</em>) strategy. 165 * While this is not guaranteed to be fair or starvation-free, earlier 166 * queued threads are allowed to recontend before later queued 167 * threads, and each recontention has an unbiased chance to succeed 168 * against incoming threads. Also, while acquires do not 169 * "spin" in the usual sense, they may perform multiple 170 * invocations of {@code tryAcquire} interspersed with other 171 * computations before blocking. This gives most of the benefits of 172 * spins when exclusive synchronization is only briefly held, without 173 * most of the liabilities when it isn't. If so desired, you can 174 * augment this by preceding calls to acquire methods with 175 * "fast-path" checks, possibly prechecking {@link #hasContended} 176 * and/or {@link #hasQueuedThreads} to only do so if the synchronizer 177 * is likely not to be contended. 178 * 179 * <p>This class provides an efficient and scalable basis for 180 * synchronization in part by specializing its range of use to 181 * synchronizers that can rely on {@code int} state, acquire, and 182 * release parameters, and an internal FIFO wait queue. When this does 183 * not suffice, you can build synchronizers from a lower level using 184 * {@link java.util.concurrent.atomic atomic} classes, your own custom 185 * {@link java.util.Queue} classes, and {@link LockSupport} blocking 186 * support. 187 * 188 * <h3>Usage Examples</h3> 189 * 190 * <p>Here is a non-reentrant mutual exclusion lock class that uses 191 * the value zero to represent the unlocked state, and one to 192 * represent the locked state. While a non-reentrant lock 193 * does not strictly require recording of the current owner 194 * thread, this class does so anyway to make usage easier to monitor. 195 * It also supports conditions and exposes 196 * one of the instrumentation methods: 197 * 198 * <pre> {@code 199 * class Mutex implements Lock, java.io.Serializable { 200 * 201 * // Our internal helper class 202 * private static class Sync extends AbstractQueuedSynchronizer { 203 * // Reports whether in locked state 204 * protected boolean isHeldExclusively() { 205 * return getState() == 1; 206 * } 207 * 208 * // Acquires the lock if state is zero 209 * public boolean tryAcquire(int acquires) { 210 * assert acquires == 1; // Otherwise unused 211 * if (compareAndSetState(0, 1)) { 212 * setExclusiveOwnerThread(Thread.currentThread()); 213 * return true; 214 * } 215 * return false; 216 * } 217 * 218 * // Releases the lock by setting state to zero 219 * protected boolean tryRelease(int releases) { 220 * assert releases == 1; // Otherwise unused 221 * if (getState() == 0) throw new IllegalMonitorStateException(); 222 * setExclusiveOwnerThread(null); 223 * setState(0); 224 * return true; 225 * } 226 * 227 * // Provides a Condition 228 * Condition newCondition() { return new ConditionObject(); } 229 * 230 * // Deserializes properly 231 * private void readObject(ObjectInputStream s) 232 * throws IOException, ClassNotFoundException { 233 * s.defaultReadObject(); 234 * setState(0); // reset to unlocked state 235 * } 236 * } 237 * 238 * // The sync object does all the hard work. We just forward to it. 239 * private final Sync sync = new Sync(); 240 * 241 * public void lock() { sync.acquire(1); } 242 * public boolean tryLock() { return sync.tryAcquire(1); } 243 * public void unlock() { sync.release(1); } 244 * public Condition newCondition() { return sync.newCondition(); } 245 * public boolean isLocked() { return sync.isHeldExclusively(); } 246 * public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); } 247 * public void lockInterruptibly() throws InterruptedException { 248 * sync.acquireInterruptibly(1); 249 * } 250 * public boolean tryLock(long timeout, TimeUnit unit) 251 * throws InterruptedException { 252 * return sync.tryAcquireNanos(1, unit.toNanos(timeout)); 253 * } 254 * }}</pre> 255 * 256 * <p>Here is a latch class that is like a 257 * {@link java.util.concurrent.CountDownLatch CountDownLatch} 258 * except that it only requires a single {@code signal} to 259 * fire. Because a latch is non-exclusive, it uses the {@code shared} 260 * acquire and release methods. 261 * 262 * <pre> {@code 263 * class BooleanLatch { 264 * 265 * private static class Sync extends AbstractQueuedSynchronizer { 266 * boolean isSignalled() { return getState() != 0; } 267 * 268 * protected int tryAcquireShared(int ignore) { 269 * return isSignalled() ? 1 : -1; 270 * } 271 * 272 * protected boolean tryReleaseShared(int ignore) { 273 * setState(1); 274 * return true; 275 * } 276 * } 277 * 278 * private final Sync sync = new Sync(); 279 * public boolean isSignalled() { return sync.isSignalled(); } 280 * public void signal() { sync.releaseShared(1); } 281 * public void await() throws InterruptedException { 282 * sync.acquireSharedInterruptibly(1); 283 * } 284 * }}</pre> 285 * 286 * @since 1.5 287 * @author Doug Lea 288 */ 289 public abstract class AbstractQueuedSynchronizer 290 extends AbstractOwnableSynchronizer 291 implements java.io.Serializable { 292 293 private static final long serialVersionUID = 7373984972572414691L; 294 295 /** 296 * Creates a new {@code AbstractQueuedSynchronizer} instance 297 * with initial synchronization state of zero. 298 */ 299 protected AbstractQueuedSynchronizer() { } 300 301 /** 302 * Wait queue node class. 303 * 304 * <p>The wait queue is a variant of a "CLH" (Craig, Landin, and 305 * Hagersten) lock queue. CLH locks are normally used for 306 * spinlocks. We instead use them for blocking synchronizers, but 307 * use the same basic tactic of holding some of the control 308 * information about a thread in the predecessor of its node. A 309 * "status" field in each node keeps track of whether a thread 310 * should block. A node is signalled when its predecessor 311 * releases. Each node of the queue otherwise serves as a 312 * specific-notification-style monitor holding a single waiting 313 * thread. The status field does NOT control whether threads are 314 * granted locks etc though. A thread may try to acquire if it is 315 * first in the queue. But being first does not guarantee success; 316 * it only gives the right to contend. So the currently released 317 * contender thread may need to rewait. 318 * 319 * <p>To enqueue into a CLH lock, you atomically splice it in as new 320 * tail. To dequeue, you just set the head field. 321 * <pre> 322 * +------+ prev +-----+ +-----+ 323 * head | | <---- | | <---- | | tail 324 * +------+ +-----+ +-----+ 325 * </pre> 326 * 327 * <p>Insertion into a CLH queue requires only a single atomic 328 * operation on "tail", so there is a simple atomic point of 329 * demarcation from unqueued to queued. Similarly, dequeuing 330 * involves only updating the "head". However, it takes a bit 331 * more work for nodes to determine who their successors are, 332 * in part to deal with possible cancellation due to timeouts 333 * and interrupts. 334 * 335 * <p>The "prev" links (not used in original CLH locks), are mainly 336 * needed to handle cancellation. If a node is cancelled, its 337 * successor is (normally) relinked to a non-cancelled 338 * predecessor. For explanation of similar mechanics in the case 339 * of spin locks, see the papers by Scott and Scherer at 340 * http://www.cs.rochester.edu/u/scott/synchronization/ 341 * 342 * <p>We also use "next" links to implement blocking mechanics. 343 * The thread id for each node is kept in its own node, so a 344 * predecessor signals the next node to wake up by traversing 345 * next link to determine which thread it is. Determination of 346 * successor must avoid races with newly queued nodes to set 347 * the "next" fields of their predecessors. This is solved 348 * when necessary by checking backwards from the atomically 349 * updated "tail" when a node's successor appears to be null. 350 * (Or, said differently, the next-links are an optimization 351 * so that we don't usually need a backward scan.) 352 * 353 * <p>Cancellation introduces some conservatism to the basic 354 * algorithms. Since we must poll for cancellation of other 355 * nodes, we can miss noticing whether a cancelled node is 356 * ahead or behind us. This is dealt with by always unparking 357 * successors upon cancellation, allowing them to stabilize on 358 * a new predecessor, unless we can identify an uncancelled 359 * predecessor who will carry this responsibility. 360 * 361 * <p>CLH queues need a dummy header node to get started. But 362 * we don't create them on construction, because it would be wasted 363 * effort if there is never contention. Instead, the node 364 * is constructed and head and tail pointers are set upon first 365 * contention. 366 * 367 * <p>Threads waiting on Conditions use the same nodes, but 368 * use an additional link. Conditions only need to link nodes 369 * in simple (non-concurrent) linked queues because they are 370 * only accessed when exclusively held. Upon await, a node is 371 * inserted into a condition queue. Upon signal, the node is 372 * transferred to the main queue. A special value of status 373 * field is used to mark which queue a node is on. 374 * 375 * <p>Thanks go to Dave Dice, Mark Moir, Victor Luchangco, Bill 376 * Scherer and Michael Scott, along with members of JSR-166 377 * expert group, for helpful ideas, discussions, and critiques 378 * on the design of this class. 379 */ 380 static final class Node { 381 /** Marker to indicate a node is waiting in shared mode */ 382 static final Node SHARED = new Node(); 383 /** Marker to indicate a node is waiting in exclusive mode */ 384 static final Node EXCLUSIVE = null; 385 386 /** waitStatus value to indicate thread has cancelled */ 387 static final int CANCELLED = 1; 388 /** waitStatus value to indicate successor's thread needs unparking */ 389 static final int SIGNAL = -1; 390 /** waitStatus value to indicate thread is waiting on condition */ 391 static final int CONDITION = -2; 392 /** 393 * waitStatus value to indicate the next acquireShared should 394 * unconditionally propagate 395 */ 396 static final int PROPAGATE = -3; 397 398 /** 399 * Status field, taking on only the values: 400 * SIGNAL: The successor of this node is (or will soon be) 401 * blocked (via park), so the current node must 402 * unpark its successor when it releases or 403 * cancels. To avoid races, acquire methods must 404 * first indicate they need a signal, 405 * then retry the atomic acquire, and then, 406 * on failure, block. 407 * CANCELLED: This node is cancelled due to timeout or interrupt. 408 * Nodes never leave this state. In particular, 409 * a thread with cancelled node never again blocks. 410 * CONDITION: This node is currently on a condition queue. 411 * It will not be used as a sync queue node 412 * until transferred, at which time the status 413 * will be set to 0. (Use of this value here has 414 * nothing to do with the other uses of the 415 * field, but simplifies mechanics.) 416 * PROPAGATE: A releaseShared should be propagated to other 417 * nodes. This is set (for head node only) in 418 * doReleaseShared to ensure propagation 419 * continues, even if other operations have 420 * since intervened. 421 * 0: None of the above 422 * 423 * The values are arranged numerically to simplify use. 424 * Non-negative values mean that a node doesn't need to 425 * signal. So, most code doesn't need to check for particular 426 * values, just for sign. 427 * 428 * The field is initialized to 0 for normal sync nodes, and 429 * CONDITION for condition nodes. It is modified using CAS 430 * (or when possible, unconditional volatile writes). 431 */ 432 volatile int waitStatus; 433 434 /** 435 * Link to predecessor node that current node/thread relies on 436 * for checking waitStatus. Assigned during enqueuing, and nulled 437 * out (for sake of GC) only upon dequeuing. Also, upon 438 * cancellation of a predecessor, we short-circuit while 439 * finding a non-cancelled one, which will always exist 440 * because the head node is never cancelled: A node becomes 441 * head only as a result of successful acquire. A 442 * cancelled thread never succeeds in acquiring, and a thread only 443 * cancels itself, not any other node. 444 */ 445 volatile Node prev; 446 447 /** 448 * Link to the successor node that the current node/thread 449 * unparks upon release. Assigned during enqueuing, adjusted 450 * when bypassing cancelled predecessors, and nulled out (for 451 * sake of GC) when dequeued. The enq operation does not 452 * assign next field of a predecessor until after attachment, 453 * so seeing a null next field does not necessarily mean that 454 * node is at end of queue. However, if a next field appears 455 * to be null, we can scan prev's from the tail to 456 * double-check. The next field of cancelled nodes is set to 457 * point to the node itself instead of null, to make life 458 * easier for isOnSyncQueue. 459 */ 460 volatile Node next; 461 462 /** 463 * The thread that enqueued this node. Initialized on 464 * construction and nulled out after use. 465 */ 466 volatile Thread thread; 467 468 /** 469 * Link to next node waiting on condition, or the special 470 * value SHARED. Because condition queues are accessed only 471 * when holding in exclusive mode, we just need a simple 472 * linked queue to hold nodes while they are waiting on 473 * conditions. They are then transferred to the queue to 474 * re-acquire. And because conditions can only be exclusive, 475 * we save a field by using special value to indicate shared 476 * mode. 477 */ 478 Node nextWaiter; 479 480 /** 481 * Returns true if node is waiting in shared mode. 482 */ 483 final boolean isShared() { 484 return nextWaiter == SHARED; 485 } 486 487 /** 488 * Returns previous node, or throws NullPointerException if null. 489 * Use when predecessor cannot be null. The null check could 490 * be elided, but is present to help the VM. 491 * 492 * @return the predecessor of this node 493 */ 494 final Node predecessor() throws NullPointerException { 495 Node p = prev; 496 if (p == null) 497 throw new NullPointerException(); 498 else 499 return p; 500 } 501 502 Node() { // Used to establish initial head or SHARED marker 503 } 504 505 Node(Thread thread, Node mode) { // Used by addWaiter 506 this.nextWaiter = mode; 507 this.thread = thread; 508 } 509 510 Node(Thread thread, int waitStatus) { // Used by Condition 511 this.waitStatus = waitStatus; 512 this.thread = thread; 513 } 514 } 515 516 /** 517 * Head of the wait queue, lazily initialized. Except for 518 * initialization, it is modified only via method setHead. Note: 519 * If head exists, its waitStatus is guaranteed not to be 520 * CANCELLED. 521 */ 522 private transient volatile Node head; 523 524 /** 525 * Tail of the wait queue, lazily initialized. Modified only via 526 * method enq to add new wait node. 527 */ 528 private transient volatile Node tail; 529 530 /** 531 * The synchronization state. 532 */ 533 private volatile int state; 534 535 /** 536 * Returns the current value of synchronization state. 537 * This operation has memory semantics of a {@code volatile} read. 538 * @return current state value 539 */ 540 protected final int getState() { 541 return state; 542 } 543 544 /** 545 * Sets the value of synchronization state. 546 * This operation has memory semantics of a {@code volatile} write. 547 * @param newState the new state value 548 */ 549 protected final void setState(int newState) { 550 state = newState; 551 } 552 553 /** 554 * Atomically sets synchronization state to the given updated 555 * value if the current state value equals the expected value. 556 * This operation has memory semantics of a {@code volatile} read 557 * and write. 558 * 559 * @param expect the expected value 560 * @param update the new value 561 * @return {@code true} if successful. False return indicates that the actual 562 * value was not equal to the expected value. 563 */ 564 protected final boolean compareAndSetState(int expect, int update) { 565 // See below for intrinsics setup to support this 566 return unsafe.compareAndSwapInt(this, stateOffset, expect, update); 567 } 568 569 // Queuing utilities 570 571 /** 572 * The number of nanoseconds for which it is faster to spin 573 * rather than to use timed park. A rough estimate suffices 574 * to improve responsiveness with very short timeouts. 575 */ 576 static final long spinForTimeoutThreshold = 1000L; 577 578 /** 579 * Inserts node into queue, initializing if necessary. See picture above. 580 * @param node the node to insert 581 * @return node's predecessor 582 */ 583 private Node enq(final Node node) { 584 for (;;) { 585 Node t = tail; 586 if (t == null) { // Must initialize 587 if (compareAndSetHead(new Node())) 588 tail = head; 589 } else { 590 node.prev = t; 591 if (compareAndSetTail(t, node)) { 592 t.next = node; 593 return t; 594 } 595 } 596 } 597 } 598 599 /** 600 * Creates and enqueues node for current thread and given mode. 601 * 602 * @param mode Node.EXCLUSIVE for exclusive, Node.SHARED for shared 603 * @return the new node 604 */ 605 private Node addWaiter(Node mode) { 606 Node node = new Node(Thread.currentThread(), mode); 607 // Try the fast path of enq; backup to full enq on failure 608 Node pred = tail; 609 if (pred != null) { 610 node.prev = pred; 611 if (compareAndSetTail(pred, node)) { 612 pred.next = node; 613 return node; 614 } 615 } 616 enq(node); 617 return node; 618 } 619 620 /** 621 * Sets head of queue to be node, thus dequeuing. Called only by 622 * acquire methods. Also nulls out unused fields for sake of GC 623 * and to suppress unnecessary signals and traversals. 624 * 625 * @param node the node 626 */ 627 private void setHead(Node node) { 628 head = node; 629 node.thread = null; 630 node.prev = null; 631 } 632 633 /** 634 * Wakes up node's successor, if one exists. 635 * 636 * @param node the node 637 */ 638 private void unparkSuccessor(Node node) { 639 /* 640 * If status is negative (i.e., possibly needing signal) try 641 * to clear in anticipation of signalling. It is OK if this 642 * fails or if status is changed by waiting thread. 643 */ 644 int ws = node.waitStatus; 645 if (ws < 0) 646 compareAndSetWaitStatus(node, ws, 0); 647 648 /* 649 * Thread to unpark is held in successor, which is normally 650 * just the next node. But if cancelled or apparently null, 651 * traverse backwards from tail to find the actual 652 * non-cancelled successor. 653 */ 654 Node s = node.next; 655 if (s == null || s.waitStatus > 0) { 656 s = null; 657 for (Node t = tail; t != null && t != node; t = t.prev) 658 if (t.waitStatus <= 0) 659 s = t; 660 } 661 if (s != null) 662 LockSupport.unpark(s.thread); 663 } 664 665 /** 666 * Release action for shared mode -- signals successor and ensures 667 * propagation. (Note: For exclusive mode, release just amounts 668 * to calling unparkSuccessor of head if it needs signal.) 669 */ 670 private void doReleaseShared() { 671 /* 672 * Ensure that a release propagates, even if there are other 673 * in-progress acquires/releases. This proceeds in the usual 674 * way of trying to unparkSuccessor of head if it needs 675 * signal. But if it does not, status is set to PROPAGATE to 676 * ensure that upon release, propagation continues. 677 * Additionally, we must loop in case a new node is added 678 * while we are doing this. Also, unlike other uses of 679 * unparkSuccessor, we need to know if CAS to reset status 680 * fails, if so rechecking. 681 */ 682 for (;;) { 683 Node h = head; 684 if (h != null && h != tail) { 685 int ws = h.waitStatus; 686 if (ws == Node.SIGNAL) { 687 if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) 688 continue; // loop to recheck cases 689 unparkSuccessor(h); 690 } 691 else if (ws == 0 && 692 !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) 693 continue; // loop on failed CAS 694 } 695 if (h == head) // loop if head changed 696 break; 697 } 698 } 699 700 /** 701 * Sets head of queue, and checks if successor may be waiting 702 * in shared mode, if so propagating if either propagate > 0 or 703 * PROPAGATE status was set. 704 * 705 * @param node the node 706 * @param propagate the return value from a tryAcquireShared 707 */ 708 private void setHeadAndPropagate(Node node, int propagate) { 709 Node h = head; // Record old head for check below 710 setHead(node); 711 /* 712 * Try to signal next queued node if: 713 * Propagation was indicated by caller, 714 * or was recorded (as h.waitStatus either before 715 * or after setHead) by a previous operation 716 * (note: this uses sign-check of waitStatus because 717 * PROPAGATE status may transition to SIGNAL.) 718 * and 719 * The next node is waiting in shared mode, 720 * or we don't know, because it appears null 721 * 722 * The conservatism in both of these checks may cause 723 * unnecessary wake-ups, but only when there are multiple 724 * racing acquires/releases, so most need signals now or soon 725 * anyway. 726 */ 727 if (propagate > 0 || h == null || h.waitStatus < 0 || 728 (h = head) == null || h.waitStatus < 0) { 729 Node s = node.next; 730 if (s == null || s.isShared()) 731 doReleaseShared(); 732 } 733 } 734 735 // Utilities for various versions of acquire 736 737 /** 738 * Cancels an ongoing attempt to acquire. 739 * 740 * @param node the node 741 */ 742 private void cancelAcquire(Node node) { 743 // Ignore if node doesn't exist 744 if (node == null) 745 return; 746 747 node.thread = null; 748 749 // Skip cancelled predecessors 750 Node pred = node.prev; 751 while (pred.waitStatus > 0) 752 node.prev = pred = pred.prev; 753 754 // predNext is the apparent node to unsplice. CASes below will 755 // fail if not, in which case, we lost race vs another cancel 756 // or signal, so no further action is necessary. 757 Node predNext = pred.next; 758 759 // Can use unconditional write instead of CAS here. 760 // After this atomic step, other Nodes can skip past us. 761 // Before, we are free of interference from other threads. 762 node.waitStatus = Node.CANCELLED; 763 764 // If we are the tail, remove ourselves. 765 if (node == tail && compareAndSetTail(node, pred)) { 766 compareAndSetNext(pred, predNext, null); 767 } else { 768 // If successor needs signal, try to set pred's next-link 769 // so it will get one. Otherwise wake it up to propagate. 770 int ws; 771 if (pred != head && 772 ((ws = pred.waitStatus) == Node.SIGNAL || 773 (ws <= 0 && compareAndSetWaitStatus(pred, ws, Node.SIGNAL))) && 774 pred.thread != null) { 775 Node next = node.next; 776 if (next != null && next.waitStatus <= 0) 777 compareAndSetNext(pred, predNext, next); 778 } else { 779 unparkSuccessor(node); 780 } 781 782 node.next = node; // help GC 783 } 784 } 785 786 /** 787 * Checks and updates status for a node that failed to acquire. 788 * Returns true if thread should block. This is the main signal 789 * control in all acquire loops. Requires that pred == node.prev. 790 * 791 * @param pred node's predecessor holding status 792 * @param node the node 793 * @return {@code true} if thread should block 794 */ 795 private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) { 796 int ws = pred.waitStatus; 797 if (ws == Node.SIGNAL) 798 /* 799 * This node has already set status asking a release 800 * to signal it, so it can safely park. 801 */ 802 return true; 803 if (ws > 0) { 804 /* 805 * Predecessor was cancelled. Skip over predecessors and 806 * indicate retry. 807 */ 808 do { 809 node.prev = pred = pred.prev; 810 } while (pred.waitStatus > 0); 811 pred.next = node; 812 } else { 813 /* 814 * waitStatus must be 0 or PROPAGATE. Indicate that we 815 * need a signal, but don't park yet. Caller will need to 816 * retry to make sure it cannot acquire before parking. 817 */ 818 compareAndSetWaitStatus(pred, ws, Node.SIGNAL); 819 } 820 return false; 821 } 822 823 /** 824 * Convenience method to interrupt current thread. 825 */ 826 static void selfInterrupt() { 827 Thread.currentThread().interrupt(); 828 } 829 830 /** 831 * Convenience method to park and then check if interrupted 832 * 833 * @return {@code true} if interrupted 834 */ 835 private final boolean parkAndCheckInterrupt() { 836 LockSupport.park(this); 837 return Thread.interrupted(); 838 } 839 840 /* 841 * Various flavors of acquire, varying in exclusive/shared and 842 * control modes. Each is mostly the same, but annoyingly 843 * different. Only a little bit of factoring is possible due to 844 * interactions of exception mechanics (including ensuring that we 845 * cancel if tryAcquire throws exception) and other control, at 846 * least not without hurting performance too much. 847 */ 848 849 /** 850 * Acquires in exclusive uninterruptible mode for thread already in 851 * queue. Used by condition wait methods as well as acquire. 852 * 853 * @param node the node 854 * @param arg the acquire argument 855 * @return {@code true} if interrupted while waiting 856 */ 857 final boolean acquireQueued(final Node node, int arg) { 858 boolean failed = true; 859 try { 860 boolean interrupted = false; 861 for (;;) { 862 final Node p = node.predecessor(); 863 if (p == head && tryAcquire(arg)) { 864 setHead(node); 865 p.next = null; // help GC 866 failed = false; 867 return interrupted; 868 } 869 if (shouldParkAfterFailedAcquire(p, node) && 870 parkAndCheckInterrupt()) 871 interrupted = true; 872 } 873 } finally { 874 if (failed) 875 cancelAcquire(node); 876 } 877 } 878 879 /** 880 * Acquires in exclusive interruptible mode. 881 * @param arg the acquire argument 882 */ 883 private void doAcquireInterruptibly(int arg) 884 throws InterruptedException { 885 final Node node = addWaiter(Node.EXCLUSIVE); 886 boolean failed = true; 887 try { 888 for (;;) { 889 final Node p = node.predecessor(); 890 if (p == head && tryAcquire(arg)) { 891 setHead(node); 892 p.next = null; // help GC 893 failed = false; 894 return; 895 } 896 if (shouldParkAfterFailedAcquire(p, node) && 897 parkAndCheckInterrupt()) 898 throw new InterruptedException(); 899 } 900 } finally { 901 if (failed) 902 cancelAcquire(node); 903 } 904 } 905 906 /** 907 * Acquires in exclusive timed mode. 908 * 909 * @param arg the acquire argument 910 * @param nanosTimeout max wait time 911 * @return {@code true} if acquired 912 */ 913 private boolean doAcquireNanos(int arg, long nanosTimeout) 914 throws InterruptedException { 915 if (nanosTimeout <= 0L) 916 return false; 917 final long deadline = System.nanoTime() + nanosTimeout; 918 final Node node = addWaiter(Node.EXCLUSIVE); 919 boolean failed = true; 920 try { 921 for (;;) { 922 final Node p = node.predecessor(); 923 if (p == head && tryAcquire(arg)) { 924 setHead(node); 925 p.next = null; // help GC 926 failed = false; 927 return true; 928 } 929 nanosTimeout = deadline - System.nanoTime(); 930 if (nanosTimeout <= 0L) 931 return false; 932 if (shouldParkAfterFailedAcquire(p, node) && 933 nanosTimeout > spinForTimeoutThreshold) 934 LockSupport.parkNanos(this, nanosTimeout); 935 if (Thread.interrupted()) 936 throw new InterruptedException(); 937 } 938 } finally { 939 if (failed) 940 cancelAcquire(node); 941 } 942 } 943 944 /** 945 * Acquires in shared uninterruptible mode. 946 * @param arg the acquire argument 947 */ 948 private void doAcquireShared(int arg) { 949 final Node node = addWaiter(Node.SHARED); 950 boolean failed = true; 951 try { 952 boolean interrupted = false; 953 for (;;) { 954 final Node p = node.predecessor(); 955 if (p == head) { 956 int r = tryAcquireShared(arg); 957 if (r >= 0) { 958 setHeadAndPropagate(node, r); 959 p.next = null; // help GC 960 if (interrupted) 961 selfInterrupt(); 962 failed = false; 963 return; 964 } 965 } 966 if (shouldParkAfterFailedAcquire(p, node) && 967 parkAndCheckInterrupt()) 968 interrupted = true; 969 } 970 } finally { 971 if (failed) 972 cancelAcquire(node); 973 } 974 } 975 976 /** 977 * Acquires in shared interruptible mode. 978 * @param arg the acquire argument 979 */ 980 private void doAcquireSharedInterruptibly(int arg) 981 throws InterruptedException { 982 final Node node = addWaiter(Node.SHARED); 983 boolean failed = true; 984 try { 985 for (;;) { 986 final Node p = node.predecessor(); 987 if (p == head) { 988 int r = tryAcquireShared(arg); 989 if (r >= 0) { 990 setHeadAndPropagate(node, r); 991 p.next = null; // help GC 992 failed = false; 993 return; 994 } 995 } 996 if (shouldParkAfterFailedAcquire(p, node) && 997 parkAndCheckInterrupt()) 998 throw new InterruptedException(); 999 } 1000 } finally { 1001 if (failed) 1002 cancelAcquire(node); 1003 } 1004 } 1005 1006 /** 1007 * Acquires in shared timed mode. 1008 * 1009 * @param arg the acquire argument 1010 * @param nanosTimeout max wait time 1011 * @return {@code true} if acquired 1012 */ 1013 private boolean doAcquireSharedNanos(int arg, long nanosTimeout) 1014 throws InterruptedException { 1015 if (nanosTimeout <= 0L) 1016 return false; 1017 final long deadline = System.nanoTime() + nanosTimeout; 1018 final Node node = addWaiter(Node.SHARED); 1019 boolean failed = true; 1020 try { 1021 for (;;) { 1022 final Node p = node.predecessor(); 1023 if (p == head) { 1024 int r = tryAcquireShared(arg); 1025 if (r >= 0) { 1026 setHeadAndPropagate(node, r); 1027 p.next = null; // help GC 1028 failed = false; 1029 return true; 1030 } 1031 } 1032 nanosTimeout = deadline - System.nanoTime(); 1033 if (nanosTimeout <= 0L) 1034 return false; 1035 if (shouldParkAfterFailedAcquire(p, node) && 1036 nanosTimeout > spinForTimeoutThreshold) 1037 LockSupport.parkNanos(this, nanosTimeout); 1038 if (Thread.interrupted()) 1039 throw new InterruptedException(); 1040 } 1041 } finally { 1042 if (failed) 1043 cancelAcquire(node); 1044 } 1045 } 1046 1047 // Main exported methods 1048 1049 /** 1050 * Attempts to acquire in exclusive mode. This method should query 1051 * if the state of the object permits it to be acquired in the 1052 * exclusive mode, and if so to acquire it. 1053 * 1054 * <p>This method is always invoked by the thread performing 1055 * acquire. If this method reports failure, the acquire method 1056 * may queue the thread, if it is not already queued, until it is 1057 * signalled by a release from some other thread. This can be used 1058 * to implement method {@link Lock#tryLock()}. 1059 * 1060 * <p>The default 1061 * implementation throws {@link UnsupportedOperationException}. 1062 * 1063 * @param arg the acquire argument. This value is always the one 1064 * passed to an acquire method, or is the value saved on entry 1065 * to a condition wait. The value is otherwise uninterpreted 1066 * and can represent anything you like. 1067 * @return {@code true} if successful. Upon success, this object has 1068 * been acquired. 1069 * @throws IllegalMonitorStateException if acquiring would place this 1070 * synchronizer in an illegal state. This exception must be 1071 * thrown in a consistent fashion for synchronization to work 1072 * correctly. 1073 * @throws UnsupportedOperationException if exclusive mode is not supported 1074 */ 1075 protected boolean tryAcquire(int arg) { 1076 throw new UnsupportedOperationException(); 1077 } 1078 1079 /** 1080 * Attempts to set the state to reflect a release in exclusive 1081 * mode. 1082 * 1083 * <p>This method is always invoked by the thread performing release. 1084 * 1085 * <p>The default implementation throws 1086 * {@link UnsupportedOperationException}. 1087 * 1088 * @param arg the release argument. This value is always the one 1089 * passed to a release method, or the current state value upon 1090 * entry to a condition wait. The value is otherwise 1091 * uninterpreted and can represent anything you like. 1092 * @return {@code true} if this object is now in a fully released 1093 * state, so that any waiting threads may attempt to acquire; 1094 * and {@code false} otherwise. 1095 * @throws IllegalMonitorStateException if releasing would place this 1096 * synchronizer in an illegal state. This exception must be 1097 * thrown in a consistent fashion for synchronization to work 1098 * correctly. 1099 * @throws UnsupportedOperationException if exclusive mode is not supported 1100 */ 1101 protected boolean tryRelease(int arg) { 1102 throw new UnsupportedOperationException(); 1103 } 1104 1105 /** 1106 * Attempts to acquire in shared mode. This method should query if 1107 * the state of the object permits it to be acquired in the shared 1108 * mode, and if so to acquire it. 1109 * 1110 * <p>This method is always invoked by the thread performing 1111 * acquire. If this method reports failure, the acquire method 1112 * may queue the thread, if it is not already queued, until it is 1113 * signalled by a release from some other thread. 1114 * 1115 * <p>The default implementation throws {@link 1116 * UnsupportedOperationException}. 1117 * 1118 * @param arg the acquire argument. This value is always the one 1119 * passed to an acquire method, or is the value saved on entry 1120 * to a condition wait. The value is otherwise uninterpreted 1121 * and can represent anything you like. 1122 * @return a negative value on failure; zero if acquisition in shared 1123 * mode succeeded but no subsequent shared-mode acquire can 1124 * succeed; and a positive value if acquisition in shared 1125 * mode succeeded and subsequent shared-mode acquires might 1126 * also succeed, in which case a subsequent waiting thread 1127 * must check availability. (Support for three different 1128 * return values enables this method to be used in contexts 1129 * where acquires only sometimes act exclusively.) Upon 1130 * success, this object has been acquired. 1131 * @throws IllegalMonitorStateException if acquiring would place this 1132 * synchronizer in an illegal state. This exception must be 1133 * thrown in a consistent fashion for synchronization to work 1134 * correctly. 1135 * @throws UnsupportedOperationException if shared mode is not supported 1136 */ 1137 protected int tryAcquireShared(int arg) { 1138 throw new UnsupportedOperationException(); 1139 } 1140 1141 /** 1142 * Attempts to set the state to reflect a release in shared mode. 1143 * 1144 * <p>This method is always invoked by the thread performing release. 1145 * 1146 * <p>The default implementation throws 1147 * {@link UnsupportedOperationException}. 1148 * 1149 * @param arg the release argument. This value is always the one 1150 * passed to a release method, or the current state value upon 1151 * entry to a condition wait. The value is otherwise 1152 * uninterpreted and can represent anything you like. 1153 * @return {@code true} if this release of shared mode may permit a 1154 * waiting acquire (shared or exclusive) to succeed; and 1155 * {@code false} otherwise 1156 * @throws IllegalMonitorStateException if releasing would place this 1157 * synchronizer in an illegal state. This exception must be 1158 * thrown in a consistent fashion for synchronization to work 1159 * correctly. 1160 * @throws UnsupportedOperationException if shared mode is not supported 1161 */ 1162 protected boolean tryReleaseShared(int arg) { 1163 throw new UnsupportedOperationException(); 1164 } 1165 1166 /** 1167 * Returns {@code true} if synchronization is held exclusively with 1168 * respect to the current (calling) thread. This method is invoked 1169 * upon each call to a non-waiting {@link ConditionObject} method. 1170 * (Waiting methods instead invoke {@link #release}.) 1171 * 1172 * <p>The default implementation throws {@link 1173 * UnsupportedOperationException}. This method is invoked 1174 * internally only within {@link ConditionObject} methods, so need 1175 * not be defined if conditions are not used. 1176 * 1177 * @return {@code true} if synchronization is held exclusively; 1178 * {@code false} otherwise 1179 * @throws UnsupportedOperationException if conditions are not supported 1180 */ 1181 protected boolean isHeldExclusively() { 1182 throw new UnsupportedOperationException(); 1183 } 1184 1185 /** 1186 * Acquires in exclusive mode, ignoring interrupts. Implemented 1187 * by invoking at least once {@link #tryAcquire}, 1188 * returning on success. Otherwise the thread is queued, possibly 1189 * repeatedly blocking and unblocking, invoking {@link 1190 * #tryAcquire} until success. This method can be used 1191 * to implement method {@link Lock#lock}. 1192 * 1193 * @param arg the acquire argument. This value is conveyed to 1194 * {@link #tryAcquire} but is otherwise uninterpreted and 1195 * can represent anything you like. 1196 */ 1197 public final void acquire(int arg) { 1198 if (!tryAcquire(arg) && 1199 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) 1200 selfInterrupt(); 1201 } 1202 1203 /** 1204 * Acquires in exclusive mode, aborting if interrupted. 1205 * Implemented by first checking interrupt status, then invoking 1206 * at least once {@link #tryAcquire}, returning on 1207 * success. Otherwise the thread is queued, possibly repeatedly 1208 * blocking and unblocking, invoking {@link #tryAcquire} 1209 * until success or the thread is interrupted. This method can be 1210 * used to implement method {@link Lock#lockInterruptibly}. 1211 * 1212 * @param arg the acquire argument. This value is conveyed to 1213 * {@link #tryAcquire} but is otherwise uninterpreted and 1214 * can represent anything you like. 1215 * @throws InterruptedException if the current thread is interrupted 1216 */ 1217 public final void acquireInterruptibly(int arg) 1218 throws InterruptedException { 1219 if (Thread.interrupted()) 1220 throw new InterruptedException(); 1221 if (!tryAcquire(arg)) 1222 doAcquireInterruptibly(arg); 1223 } 1224 1225 /** 1226 * Attempts to acquire in exclusive mode, aborting if interrupted, 1227 * and failing if the given timeout elapses. Implemented by first 1228 * checking interrupt status, then invoking at least once {@link 1229 * #tryAcquire}, returning on success. Otherwise, the thread is 1230 * queued, possibly repeatedly blocking and unblocking, invoking 1231 * {@link #tryAcquire} until success or the thread is interrupted 1232 * or the timeout elapses. This method can be used to implement 1233 * method {@link Lock#tryLock(long, TimeUnit)}. 1234 * 1235 * @param arg the acquire argument. This value is conveyed to 1236 * {@link #tryAcquire} but is otherwise uninterpreted and 1237 * can represent anything you like. 1238 * @param nanosTimeout the maximum number of nanoseconds to wait 1239 * @return {@code true} if acquired; {@code false} if timed out 1240 * @throws InterruptedException if the current thread is interrupted 1241 */ 1242 public final boolean tryAcquireNanos(int arg, long nanosTimeout) 1243 throws InterruptedException { 1244 if (Thread.interrupted()) 1245 throw new InterruptedException(); 1246 return tryAcquire(arg) || 1247 doAcquireNanos(arg, nanosTimeout); 1248 } 1249 1250 /** 1251 * Releases in exclusive mode. Implemented by unblocking one or 1252 * more threads if {@link #tryRelease} returns true. 1253 * This method can be used to implement method {@link Lock#unlock}. 1254 * 1255 * @param arg the release argument. This value is conveyed to 1256 * {@link #tryRelease} but is otherwise uninterpreted and 1257 * can represent anything you like. 1258 * @return the value returned from {@link #tryRelease} 1259 */ 1260 public final boolean release(int arg) { 1261 if (tryRelease(arg)) { 1262 Node h = head; 1263 if (h != null && h.waitStatus != 0) 1264 unparkSuccessor(h); 1265 return true; 1266 } 1267 return false; 1268 } 1269 1270 /** 1271 * Acquires in shared mode, ignoring interrupts. Implemented by 1272 * first invoking at least once {@link #tryAcquireShared}, 1273 * returning on success. Otherwise the thread is queued, possibly 1274 * repeatedly blocking and unblocking, invoking {@link 1275 * #tryAcquireShared} until success. 1276 * 1277 * @param arg the acquire argument. This value is conveyed to 1278 * {@link #tryAcquireShared} but is otherwise uninterpreted 1279 * and can represent anything you like. 1280 */ 1281 public final void acquireShared(int arg) { 1282 if (tryAcquireShared(arg) < 0) 1283 doAcquireShared(arg); 1284 } 1285 1286 /** 1287 * Acquires in shared mode, aborting if interrupted. Implemented 1288 * by first checking interrupt status, then invoking at least once 1289 * {@link #tryAcquireShared}, returning on success. Otherwise the 1290 * thread is queued, possibly repeatedly blocking and unblocking, 1291 * invoking {@link #tryAcquireShared} until success or the thread 1292 * is interrupted. 1293 * @param arg the acquire argument. 1294 * This value is conveyed to {@link #tryAcquireShared} but is 1295 * otherwise uninterpreted and can represent anything 1296 * you like. 1297 * @throws InterruptedException if the current thread is interrupted 1298 */ 1299 public final void acquireSharedInterruptibly(int arg) 1300 throws InterruptedException { 1301 if (Thread.interrupted()) 1302 throw new InterruptedException(); 1303 if (tryAcquireShared(arg) < 0) 1304 doAcquireSharedInterruptibly(arg); 1305 } 1306 1307 /** 1308 * Attempts to acquire in shared mode, aborting if interrupted, and 1309 * failing if the given timeout elapses. Implemented by first 1310 * checking interrupt status, then invoking at least once {@link 1311 * #tryAcquireShared}, returning on success. Otherwise, the 1312 * thread is queued, possibly repeatedly blocking and unblocking, 1313 * invoking {@link #tryAcquireShared} until success or the thread 1314 * is interrupted or the timeout elapses. 1315 * 1316 * @param arg the acquire argument. This value is conveyed to 1317 * {@link #tryAcquireShared} but is otherwise uninterpreted 1318 * and can represent anything you like. 1319 * @param nanosTimeout the maximum number of nanoseconds to wait 1320 * @return {@code true} if acquired; {@code false} if timed out 1321 * @throws InterruptedException if the current thread is interrupted 1322 */ 1323 public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout) 1324 throws InterruptedException { 1325 if (Thread.interrupted()) 1326 throw new InterruptedException(); 1327 return tryAcquireShared(arg) >= 0 || 1328 doAcquireSharedNanos(arg, nanosTimeout); 1329 } 1330 1331 /** 1332 * Releases in shared mode. Implemented by unblocking one or more 1333 * threads if {@link #tryReleaseShared} returns true. 1334 * 1335 * @param arg the release argument. This value is conveyed to 1336 * {@link #tryReleaseShared} but is otherwise uninterpreted 1337 * and can represent anything you like. 1338 * @return the value returned from {@link #tryReleaseShared} 1339 */ 1340 public final boolean releaseShared(int arg) { 1341 if (tryReleaseShared(arg)) { 1342 doReleaseShared(); 1343 return true; 1344 } 1345 return false; 1346 } 1347 1348 // Queue inspection methods 1349 1350 /** 1351 * Queries whether any threads are waiting to acquire. Note that 1352 * because cancellations due to interrupts and timeouts may occur 1353 * at any time, a {@code true} return does not guarantee that any 1354 * other thread will ever acquire. 1355 * 1356 * <p>In this implementation, this operation returns in 1357 * constant time. 1358 * 1359 * @return {@code true} if there may be other threads waiting to acquire 1360 */ 1361 public final boolean hasQueuedThreads() { 1362 return head != tail; 1363 } 1364 1365 /** 1366 * Queries whether any threads have ever contended to acquire this 1367 * synchronizer; that is if an acquire method has ever blocked. 1368 * 1369 * <p>In this implementation, this operation returns in 1370 * constant time. 1371 * 1372 * @return {@code true} if there has ever been contention 1373 */ 1374 public final boolean hasContended() { 1375 return head != null; 1376 } 1377 1378 /** 1379 * Returns the first (longest-waiting) thread in the queue, or 1380 * {@code null} if no threads are currently queued. 1381 * 1382 * <p>In this implementation, this operation normally returns in 1383 * constant time, but may iterate upon contention if other threads are 1384 * concurrently modifying the queue. 1385 * 1386 * @return the first (longest-waiting) thread in the queue, or 1387 * {@code null} if no threads are currently queued 1388 */ 1389 public final Thread getFirstQueuedThread() { 1390 // handle only fast path, else relay 1391 return (head == tail) ? null : fullGetFirstQueuedThread(); 1392 } 1393 1394 /** 1395 * Version of getFirstQueuedThread called when fastpath fails 1396 */ 1397 private Thread fullGetFirstQueuedThread() { 1398 /* 1399 * The first node is normally head.next. Try to get its 1400 * thread field, ensuring consistent reads: If thread 1401 * field is nulled out or s.prev is no longer head, then 1402 * some other thread(s) concurrently performed setHead in 1403 * between some of our reads. We try this twice before 1404 * resorting to traversal. 1405 */ 1406 Node h, s; 1407 Thread st; 1408 if (((h = head) != null && (s = h.next) != null && 1409 s.prev == head && (st = s.thread) != null) || 1410 ((h = head) != null && (s = h.next) != null && 1411 s.prev == head && (st = s.thread) != null)) 1412 return st; 1413 1414 /* 1415 * Head's next field might not have been set yet, or may have 1416 * been unset after setHead. So we must check to see if tail 1417 * is actually first node. If not, we continue on, safely 1418 * traversing from tail back to head to find first, 1419 * guaranteeing termination. 1420 */ 1421 1422 Node t = tail; 1423 Thread firstThread = null; 1424 while (t != null && t != head) { 1425 Thread tt = t.thread; 1426 if (tt != null) 1427 firstThread = tt; 1428 t = t.prev; 1429 } 1430 return firstThread; 1431 } 1432 1433 /** 1434 * Returns true if the given thread is currently queued. 1435 * 1436 * <p>This implementation traverses the queue to determine 1437 * presence of the given thread. 1438 * 1439 * @param thread the thread 1440 * @return {@code true} if the given thread is on the queue 1441 * @throws NullPointerException if the thread is null 1442 */ 1443 public final boolean isQueued(Thread thread) { 1444 if (thread == null) 1445 throw new NullPointerException(); 1446 for (Node p = tail; p != null; p = p.prev) 1447 if (p.thread == thread) 1448 return true; 1449 return false; 1450 } 1451 1452 /** 1453 * Returns {@code true} if the apparent first queued thread, if one 1454 * exists, is waiting in exclusive mode. If this method returns 1455 * {@code true}, and the current thread is attempting to acquire in 1456 * shared mode (that is, this method is invoked from {@link 1457 * #tryAcquireShared}) then it is guaranteed that the current thread 1458 * is not the first queued thread. Used only as a heuristic in 1459 * ReentrantReadWriteLock. 1460 */ 1461 final boolean apparentlyFirstQueuedIsExclusive() { 1462 Node h, s; 1463 return (h = head) != null && 1464 (s = h.next) != null && 1465 !s.isShared() && 1466 s.thread != null; 1467 } 1468 1469 /** 1470 * Queries whether any threads have been waiting to acquire longer 1471 * than the current thread. 1472 * 1473 * <p>An invocation of this method is equivalent to (but may be 1474 * more efficient than): 1475 * <pre> {@code 1476 * getFirstQueuedThread() != Thread.currentThread() && 1477 * hasQueuedThreads()}</pre> 1478 * 1479 * <p>Note that because cancellations due to interrupts and 1480 * timeouts may occur at any time, a {@code true} return does not 1481 * guarantee that some other thread will acquire before the current 1482 * thread. Likewise, it is possible for another thread to win a 1483 * race to enqueue after this method has returned {@code false}, 1484 * due to the queue being empty. 1485 * 1486 * <p>This method is designed to be used by a fair synchronizer to 1487 * avoid <a href="AbstractQueuedSynchronizer#barging">barging</a>. 1488 * Such a synchronizer's {@link #tryAcquire} method should return 1489 * {@code false}, and its {@link #tryAcquireShared} method should 1490 * return a negative value, if this method returns {@code true} 1491 * (unless this is a reentrant acquire). For example, the {@code 1492 * tryAcquire} method for a fair, reentrant, exclusive mode 1493 * synchronizer might look like this: 1494 * 1495 * <pre> {@code 1496 * protected boolean tryAcquire(int arg) { 1497 * if (isHeldExclusively()) { 1498 * // A reentrant acquire; increment hold count 1499 * return true; 1500 * } else if (hasQueuedPredecessors()) { 1501 * return false; 1502 * } else { 1503 * // try to acquire normally 1504 * } 1505 * }}</pre> 1506 * 1507 * @return {@code true} if there is a queued thread preceding the 1508 * current thread, and {@code false} if the current thread 1509 * is at the head of the queue or the queue is empty 1510 * @since 1.7 1511 */ 1512 public final boolean hasQueuedPredecessors() { 1513 // The correctness of this depends on head being initialized 1514 // before tail and on head.next being accurate if the current 1515 // thread is first in queue. 1516 Node t = tail; // Read fields in reverse initialization order 1517 Node h = head; 1518 Node s; 1519 return h != t && 1520 ((s = h.next) == null || s.thread != Thread.currentThread()); 1521 } 1522 1523 1524 // Instrumentation and monitoring methods 1525 1526 /** 1527 * Returns an estimate of the number of threads waiting to 1528 * acquire. The value is only an estimate because the number of 1529 * threads may change dynamically while this method traverses 1530 * internal data structures. This method is designed for use in 1531 * monitoring system state, not for synchronization 1532 * control. 1533 * 1534 * @return the estimated number of threads waiting to acquire 1535 */ 1536 public final int getQueueLength() { 1537 int n = 0; 1538 for (Node p = tail; p != null; p = p.prev) { 1539 if (p.thread != null) 1540 ++n; 1541 } 1542 return n; 1543 } 1544 1545 /** 1546 * Returns a collection containing threads that may be waiting to 1547 * acquire. Because the actual set of threads may change 1548 * dynamically while constructing this result, the returned 1549 * collection is only a best-effort estimate. The elements of the 1550 * returned collection are in no particular order. This method is 1551 * designed to facilitate construction of subclasses that provide 1552 * more extensive monitoring facilities. 1553 * 1554 * @return the collection of threads 1555 */ 1556 public final Collection<Thread> getQueuedThreads() { 1557 ArrayList<Thread> list = new ArrayList<Thread>(); 1558 for (Node p = tail; p != null; p = p.prev) { 1559 Thread t = p.thread; 1560 if (t != null) 1561 list.add(t); 1562 } 1563 return list; 1564 } 1565 1566 /** 1567 * Returns a collection containing threads that may be waiting to 1568 * acquire in exclusive mode. This has the same properties 1569 * as {@link #getQueuedThreads} except that it only returns 1570 * those threads waiting due to an exclusive acquire. 1571 * 1572 * @return the collection of threads 1573 */ 1574 public final Collection<Thread> getExclusiveQueuedThreads() { 1575 ArrayList<Thread> list = new ArrayList<Thread>(); 1576 for (Node p = tail; p != null; p = p.prev) { 1577 if (!p.isShared()) { 1578 Thread t = p.thread; 1579 if (t != null) 1580 list.add(t); 1581 } 1582 } 1583 return list; 1584 } 1585 1586 /** 1587 * Returns a collection containing threads that may be waiting to 1588 * acquire in shared mode. This has the same properties 1589 * as {@link #getQueuedThreads} except that it only returns 1590 * those threads waiting due to a shared acquire. 1591 * 1592 * @return the collection of threads 1593 */ 1594 public final Collection<Thread> getSharedQueuedThreads() { 1595 ArrayList<Thread> list = new ArrayList<Thread>(); 1596 for (Node p = tail; p != null; p = p.prev) { 1597 if (p.isShared()) { 1598 Thread t = p.thread; 1599 if (t != null) 1600 list.add(t); 1601 } 1602 } 1603 return list; 1604 } 1605 1606 /** 1607 * Returns a string identifying this synchronizer, as well as its state. 1608 * The state, in brackets, includes the String {@code "State ="} 1609 * followed by the current value of {@link #getState}, and either 1610 * {@code "nonempty"} or {@code "empty"} depending on whether the 1611 * queue is empty. 1612 * 1613 * @return a string identifying this synchronizer, as well as its state 1614 */ 1615 public String toString() { 1616 int s = getState(); 1617 String q = hasQueuedThreads() ? "non" : ""; 1618 return super.toString() + 1619 "[State = " + s + ", " + q + "empty queue]"; 1620 } 1621 1622 1623 // Internal support methods for Conditions 1624 1625 /** 1626 * Returns true if a node, always one that was initially placed on 1627 * a condition queue, is now waiting to reacquire on sync queue. 1628 * @param node the node 1629 * @return true if is reacquiring 1630 */ 1631 final boolean isOnSyncQueue(Node node) { 1632 if (node.waitStatus == Node.CONDITION || node.prev == null) 1633 return false; 1634 if (node.next != null) // If has successor, it must be on queue 1635 return true; 1636 /* 1637 * node.prev can be non-null, but not yet on queue because 1638 * the CAS to place it on queue can fail. So we have to 1639 * traverse from tail to make sure it actually made it. It 1640 * will always be near the tail in calls to this method, and 1641 * unless the CAS failed (which is unlikely), it will be 1642 * there, so we hardly ever traverse much. 1643 */ 1644 return findNodeFromTail(node); 1645 } 1646 1647 /** 1648 * Returns true if node is on sync queue by searching backwards from tail. 1649 * Called only when needed by isOnSyncQueue. 1650 * @return true if present 1651 */ 1652 private boolean findNodeFromTail(Node node) { 1653 Node t = tail; 1654 for (;;) { 1655 if (t == node) 1656 return true; 1657 if (t == null) 1658 return false; 1659 t = t.prev; 1660 } 1661 } 1662 1663 /** 1664 * Transfers a node from a condition queue onto sync queue. 1665 * Returns true if successful. 1666 * @param node the node 1667 * @return true if successfully transferred (else the node was 1668 * cancelled before signal) 1669 */ 1670 final boolean transferForSignal(Node node) { 1671 /* 1672 * If cannot change waitStatus, the node has been cancelled. 1673 */ 1674 if (!compareAndSetWaitStatus(node, Node.CONDITION, 0)) 1675 return false; 1676 1677 /* 1678 * Splice onto queue and try to set waitStatus of predecessor to 1679 * indicate that thread is (probably) waiting. If cancelled or 1680 * attempt to set waitStatus fails, wake up to resync (in which 1681 * case the waitStatus can be transiently and harmlessly wrong). 1682 */ 1683 Node p = enq(node); 1684 int ws = p.waitStatus; 1685 if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL)) 1686 LockSupport.unpark(node.thread); 1687 return true; 1688 } 1689 1690 /** 1691 * Transfers node, if necessary, to sync queue after a cancelled wait. 1692 * Returns true if thread was cancelled before being signalled. 1693 * 1694 * @param node the node 1695 * @return true if cancelled before the node was signalled 1696 */ 1697 final boolean transferAfterCancelledWait(Node node) { 1698 if (compareAndSetWaitStatus(node, Node.CONDITION, 0)) { 1699 enq(node); 1700 return true; 1701 } 1702 /* 1703 * If we lost out to a signal(), then we can't proceed 1704 * until it finishes its enq(). Cancelling during an 1705 * incomplete transfer is both rare and transient, so just 1706 * spin. 1707 */ 1708 while (!isOnSyncQueue(node)) 1709 Thread.yield(); 1710 return false; 1711 } 1712 1713 /** 1714 * Invokes release with current state value; returns saved state. 1715 * Cancels node and throws exception on failure. 1716 * @param node the condition node for this wait 1717 * @return previous sync state 1718 */ 1719 final int fullyRelease(Node node) { 1720 boolean failed = true; 1721 try { 1722 int savedState = getState(); 1723 if (release(savedState)) { 1724 failed = false; 1725 return savedState; 1726 } else { 1727 throw new IllegalMonitorStateException(); 1728 } 1729 } finally { 1730 if (failed) 1731 node.waitStatus = Node.CANCELLED; 1732 } 1733 } 1734 1735 // Instrumentation methods for conditions 1736 1737 /** 1738 * Queries whether the given ConditionObject 1739 * uses this synchronizer as its lock. 1740 * 1741 * @param condition the condition 1742 * @return {@code true} if owned 1743 * @throws NullPointerException if the condition is null 1744 */ 1745 public final boolean owns(ConditionObject condition) { 1746 return condition.isOwnedBy(this); 1747 } 1748 1749 /** 1750 * Queries whether any threads are waiting on the given condition 1751 * associated with this synchronizer. Note that because timeouts 1752 * and interrupts may occur at any time, a {@code true} return 1753 * does not guarantee that a future {@code signal} will awaken 1754 * any threads. This method is designed primarily for use in 1755 * monitoring of the system state. 1756 * 1757 * @param condition the condition 1758 * @return {@code true} if there are any waiting threads 1759 * @throws IllegalMonitorStateException if exclusive synchronization 1760 * is not held 1761 * @throws IllegalArgumentException if the given condition is 1762 * not associated with this synchronizer 1763 * @throws NullPointerException if the condition is null 1764 */ 1765 public final boolean hasWaiters(ConditionObject condition) { 1766 if (!owns(condition)) 1767 throw new IllegalArgumentException("Not owner"); 1768 return condition.hasWaiters(); 1769 } 1770 1771 /** 1772 * Returns an estimate of the number of threads waiting on the 1773 * given condition associated with this synchronizer. Note that 1774 * because timeouts and interrupts may occur at any time, the 1775 * estimate serves only as an upper bound on the actual number of 1776 * waiters. This method is designed for use in monitoring of the 1777 * system state, not for synchronization control. 1778 * 1779 * @param condition the condition 1780 * @return the estimated number of waiting threads 1781 * @throws IllegalMonitorStateException if exclusive synchronization 1782 * is not held 1783 * @throws IllegalArgumentException if the given condition is 1784 * not associated with this synchronizer 1785 * @throws NullPointerException if the condition is null 1786 */ 1787 public final int getWaitQueueLength(ConditionObject condition) { 1788 if (!owns(condition)) 1789 throw new IllegalArgumentException("Not owner"); 1790 return condition.getWaitQueueLength(); 1791 } 1792 1793 /** 1794 * Returns a collection containing those threads that may be 1795 * waiting on the given condition associated with this 1796 * synchronizer. Because the actual set of threads may change 1797 * dynamically while constructing this result, the returned 1798 * collection is only a best-effort estimate. The elements of the 1799 * returned collection are in no particular order. 1800 * 1801 * @param condition the condition 1802 * @return the collection of threads 1803 * @throws IllegalMonitorStateException if exclusive synchronization 1804 * is not held 1805 * @throws IllegalArgumentException if the given condition is 1806 * not associated with this synchronizer 1807 * @throws NullPointerException if the condition is null 1808 */ 1809 public final Collection<Thread> getWaitingThreads(ConditionObject condition) { 1810 if (!owns(condition)) 1811 throw new IllegalArgumentException("Not owner"); 1812 return condition.getWaitingThreads(); 1813 } 1814 1815 /** 1816 * Condition implementation for a {@link 1817 * AbstractQueuedSynchronizer} serving as the basis of a {@link 1818 * Lock} implementation. 1819 * 1820 * <p>Method documentation for this class describes mechanics, 1821 * not behavioral specifications from the point of view of Lock 1822 * and Condition users. Exported versions of this class will in 1823 * general need to be accompanied by documentation describing 1824 * condition semantics that rely on those of the associated 1825 * {@code AbstractQueuedSynchronizer}. 1826 * 1827 * <p>This class is Serializable, but all fields are transient, 1828 * so deserialized conditions have no waiters. 1829 */ 1830 public class ConditionObject implements Condition, java.io.Serializable { 1831 private static final long serialVersionUID = 1173984872572414699L; 1832 /** First node of condition queue. */ 1833 private transient Node firstWaiter; 1834 /** Last node of condition queue. */ 1835 private transient Node lastWaiter; 1836 1837 /** 1838 * Creates a new {@code ConditionObject} instance. 1839 */ 1840 public ConditionObject() { } 1841 1842 // Internal methods 1843 1844 /** 1845 * Adds a new waiter to wait queue. 1846 * @return its new wait node 1847 */ 1848 private Node addConditionWaiter() { 1849 Node t = lastWaiter; 1850 // If lastWaiter is cancelled, clean out. 1851 if (t != null && t.waitStatus != Node.CONDITION) { 1852 unlinkCancelledWaiters(); 1853 t = lastWaiter; 1854 } 1855 Node node = new Node(Thread.currentThread(), Node.CONDITION); 1856 if (t == null) 1857 firstWaiter = node; 1858 else 1859 t.nextWaiter = node; 1860 lastWaiter = node; 1861 return node; 1862 } 1863 1864 /** 1865 * Removes and transfers nodes until hit non-cancelled one or 1866 * null. Split out from signal in part to encourage compilers 1867 * to inline the case of no waiters. 1868 * @param first (non-null) the first node on condition queue 1869 */ 1870 private void doSignal(Node first) { 1871 do { 1872 if ( (firstWaiter = first.nextWaiter) == null) 1873 lastWaiter = null; 1874 first.nextWaiter = null; 1875 } while (!transferForSignal(first) && 1876 (first = firstWaiter) != null); 1877 } 1878 1879 /** 1880 * Removes and transfers all nodes. 1881 * @param first (non-null) the first node on condition queue 1882 */ 1883 private void doSignalAll(Node first) { 1884 lastWaiter = firstWaiter = null; 1885 do { 1886 Node next = first.nextWaiter; 1887 first.nextWaiter = null; 1888 transferForSignal(first); 1889 first = next; 1890 } while (first != null); 1891 } 1892 1893 /** 1894 * Unlinks cancelled waiter nodes from condition queue. 1895 * Called only while holding lock. This is called when 1896 * cancellation occurred during condition wait, and upon 1897 * insertion of a new waiter when lastWaiter is seen to have 1898 * been cancelled. This method is needed to avoid garbage 1899 * retention in the absence of signals. So even though it may 1900 * require a full traversal, it comes into play only when 1901 * timeouts or cancellations occur in the absence of 1902 * signals. It traverses all nodes rather than stopping at a 1903 * particular target to unlink all pointers to garbage nodes 1904 * without requiring many re-traversals during cancellation 1905 * storms. 1906 */ 1907 private void unlinkCancelledWaiters() { 1908 Node t = firstWaiter; 1909 Node trail = null; 1910 while (t != null) { 1911 Node next = t.nextWaiter; 1912 if (t.waitStatus != Node.CONDITION) { 1913 t.nextWaiter = null; 1914 if (trail == null) 1915 firstWaiter = next; 1916 else 1917 trail.nextWaiter = next; 1918 if (next == null) 1919 lastWaiter = trail; 1920 } 1921 else 1922 trail = t; 1923 t = next; 1924 } 1925 } 1926 1927 // public methods 1928 1929 /** 1930 * Moves the longest-waiting thread, if one exists, from the 1931 * wait queue for this condition to the wait queue for the 1932 * owning lock. 1933 * 1934 * @throws IllegalMonitorStateException if {@link #isHeldExclusively} 1935 * returns {@code false} 1936 */ 1937 public final void signal() { 1938 if (!isHeldExclusively()) 1939 throw new IllegalMonitorStateException(); 1940 Node first = firstWaiter; 1941 if (first != null) 1942 doSignal(first); 1943 } 1944 1945 /** 1946 * Moves all threads from the wait queue for this condition to 1947 * the wait queue for the owning lock. 1948 * 1949 * @throws IllegalMonitorStateException if {@link #isHeldExclusively} 1950 * returns {@code false} 1951 */ 1952 public final void signalAll() { 1953 if (!isHeldExclusively()) 1954 throw new IllegalMonitorStateException(); 1955 Node first = firstWaiter; 1956 if (first != null) 1957 doSignalAll(first); 1958 } 1959 1960 /** 1961 * Implements uninterruptible condition wait. 1962 * <ol> 1963 * <li> Save lock state returned by {@link #getState}. 1964 * <li> Invoke {@link #release} with saved state as argument, 1965 * throwing IllegalMonitorStateException if it fails. 1966 * <li> Block until signalled. 1967 * <li> Reacquire by invoking specialized version of 1968 * {@link #acquire} with saved state as argument. 1969 * </ol> 1970 */ 1971 public final void awaitUninterruptibly() { 1972 Node node = addConditionWaiter(); 1973 int savedState = fullyRelease(node); 1974 boolean interrupted = false; 1975 while (!isOnSyncQueue(node)) { 1976 LockSupport.park(this); 1977 if (Thread.interrupted()) 1978 interrupted = true; 1979 } 1980 if (acquireQueued(node, savedState) || interrupted) 1981 selfInterrupt(); 1982 } 1983 1984 /* 1985 * For interruptible waits, we need to track whether to throw 1986 * InterruptedException, if interrupted while blocked on 1987 * condition, versus reinterrupt current thread, if 1988 * interrupted while blocked waiting to re-acquire. 1989 */ 1990 1991 /** Mode meaning to reinterrupt on exit from wait */ 1992 private static final int REINTERRUPT = 1; 1993 /** Mode meaning to throw InterruptedException on exit from wait */ 1994 private static final int THROW_IE = -1; 1995 1996 /** 1997 * Checks for interrupt, returning THROW_IE if interrupted 1998 * before signalled, REINTERRUPT if after signalled, or 1999 * 0 if not interrupted. 2000 */ 2001 private int checkInterruptWhileWaiting(Node node) { 2002 return Thread.interrupted() ? 2003 (transferAfterCancelledWait(node) ? THROW_IE : REINTERRUPT) : 2004 0; 2005 } 2006 2007 /** 2008 * Throws InterruptedException, reinterrupts current thread, or 2009 * does nothing, depending on mode. 2010 */ 2011 private void reportInterruptAfterWait(int interruptMode) 2012 throws InterruptedException { 2013 if (interruptMode == THROW_IE) 2014 throw new InterruptedException(); 2015 else if (interruptMode == REINTERRUPT) 2016 selfInterrupt(); 2017 } 2018 2019 /** 2020 * Implements interruptible condition wait. 2021 * <ol> 2022 * <li> If current thread is interrupted, throw InterruptedException. 2023 * <li> Save lock state returned by {@link #getState}. 2024 * <li> Invoke {@link #release} with saved state as argument, 2025 * throwing IllegalMonitorStateException if it fails. 2026 * <li> Block until signalled or interrupted. 2027 * <li> Reacquire by invoking specialized version of 2028 * {@link #acquire} with saved state as argument. 2029 * <li> If interrupted while blocked in step 4, throw InterruptedException. 2030 * </ol> 2031 */ 2032 public final void await() throws InterruptedException { 2033 if (Thread.interrupted()) 2034 throw new InterruptedException(); 2035 Node node = addConditionWaiter(); 2036 int savedState = fullyRelease(node); 2037 int interruptMode = 0; 2038 while (!isOnSyncQueue(node)) { 2039 LockSupport.park(this); 2040 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) 2041 break; 2042 } 2043 if (acquireQueued(node, savedState) && interruptMode != THROW_IE) 2044 interruptMode = REINTERRUPT; 2045 if (node.nextWaiter != null) // clean up if cancelled 2046 unlinkCancelledWaiters(); 2047 if (interruptMode != 0) 2048 reportInterruptAfterWait(interruptMode); 2049 } 2050 2051 /** 2052 * Implements timed condition wait. 2053 * <ol> 2054 * <li> If current thread is interrupted, throw InterruptedException. 2055 * <li> Save lock state returned by {@link #getState}. 2056 * <li> Invoke {@link #release} with saved state as argument, 2057 * throwing IllegalMonitorStateException if it fails. 2058 * <li> Block until signalled, interrupted, or timed out. 2059 * <li> Reacquire by invoking specialized version of 2060 * {@link #acquire} with saved state as argument. 2061 * <li> If interrupted while blocked in step 4, throw InterruptedException. 2062 * </ol> 2063 */ 2064 public final long awaitNanos(long nanosTimeout) 2065 throws InterruptedException { 2066 if (Thread.interrupted()) 2067 throw new InterruptedException(); 2068 Node node = addConditionWaiter(); 2069 int savedState = fullyRelease(node); 2070 final long deadline = System.nanoTime() + nanosTimeout; 2071 int interruptMode = 0; 2072 while (!isOnSyncQueue(node)) { 2073 if (nanosTimeout <= 0L) { 2074 transferAfterCancelledWait(node); 2075 break; 2076 } 2077 if (nanosTimeout >= spinForTimeoutThreshold) 2078 LockSupport.parkNanos(this, nanosTimeout); 2079 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) 2080 break; 2081 nanosTimeout = deadline - System.nanoTime(); 2082 } 2083 if (acquireQueued(node, savedState) && interruptMode != THROW_IE) 2084 interruptMode = REINTERRUPT; 2085 if (node.nextWaiter != null) 2086 unlinkCancelledWaiters(); 2087 if (interruptMode != 0) 2088 reportInterruptAfterWait(interruptMode); 2089 return deadline - System.nanoTime(); 2090 } 2091 2092 /** 2093 * Implements absolute timed condition wait. 2094 * <ol> 2095 * <li> If current thread is interrupted, throw InterruptedException. 2096 * <li> Save lock state returned by {@link #getState}. 2097 * <li> Invoke {@link #release} with saved state as argument, 2098 * throwing IllegalMonitorStateException if it fails. 2099 * <li> Block until signalled, interrupted, or timed out. 2100 * <li> Reacquire by invoking specialized version of 2101 * {@link #acquire} with saved state as argument. 2102 * <li> If interrupted while blocked in step 4, throw InterruptedException. 2103 * <li> If timed out while blocked in step 4, return false, else true. 2104 * </ol> 2105 */ 2106 public final boolean awaitUntil(Date deadline) 2107 throws InterruptedException { 2108 long abstime = deadline.getTime(); 2109 if (Thread.interrupted()) 2110 throw new InterruptedException(); 2111 Node node = addConditionWaiter(); 2112 int savedState = fullyRelease(node); 2113 boolean timedout = false; 2114 int interruptMode = 0; 2115 while (!isOnSyncQueue(node)) { 2116 if (System.currentTimeMillis() > abstime) { 2117 timedout = transferAfterCancelledWait(node); 2118 break; 2119 } 2120 LockSupport.parkUntil(this, abstime); 2121 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) 2122 break; 2123 } 2124 if (acquireQueued(node, savedState) && interruptMode != THROW_IE) 2125 interruptMode = REINTERRUPT; 2126 if (node.nextWaiter != null) 2127 unlinkCancelledWaiters(); 2128 if (interruptMode != 0) 2129 reportInterruptAfterWait(interruptMode); 2130 return !timedout; 2131 } 2132 2133 /** 2134 * Implements timed condition wait. 2135 * <ol> 2136 * <li> If current thread is interrupted, throw InterruptedException. 2137 * <li> Save lock state returned by {@link #getState}. 2138 * <li> Invoke {@link #release} with saved state as argument, 2139 * throwing IllegalMonitorStateException if it fails. 2140 * <li> Block until signalled, interrupted, or timed out. 2141 * <li> Reacquire by invoking specialized version of 2142 * {@link #acquire} with saved state as argument. 2143 * <li> If interrupted while blocked in step 4, throw InterruptedException. 2144 * <li> If timed out while blocked in step 4, return false, else true. 2145 * </ol> 2146 */ 2147 public final boolean await(long time, TimeUnit unit) 2148 throws InterruptedException { 2149 long nanosTimeout = unit.toNanos(time); 2150 if (Thread.interrupted()) 2151 throw new InterruptedException(); 2152 Node node = addConditionWaiter(); 2153 int savedState = fullyRelease(node); 2154 final long deadline = System.nanoTime() + nanosTimeout; 2155 boolean timedout = false; 2156 int interruptMode = 0; 2157 while (!isOnSyncQueue(node)) { 2158 if (nanosTimeout <= 0L) { 2159 timedout = transferAfterCancelledWait(node); 2160 break; 2161 } 2162 if (nanosTimeout >= spinForTimeoutThreshold) 2163 LockSupport.parkNanos(this, nanosTimeout); 2164 if ((interruptMode = checkInterruptWhileWaiting(node)) != 0) 2165 break; 2166 nanosTimeout = deadline - System.nanoTime(); 2167 } 2168 if (acquireQueued(node, savedState) && interruptMode != THROW_IE) 2169 interruptMode = REINTERRUPT; 2170 if (node.nextWaiter != null) 2171 unlinkCancelledWaiters(); 2172 if (interruptMode != 0) 2173 reportInterruptAfterWait(interruptMode); 2174 return !timedout; 2175 } 2176 2177 // support for instrumentation 2178 2179 /** 2180 * Returns true if this condition was created by the given 2181 * synchronization object. 2182 * 2183 * @return {@code true} if owned 2184 */ 2185 final boolean isOwnedBy(AbstractQueuedSynchronizer sync) { 2186 return sync == AbstractQueuedSynchronizer.this; 2187 } 2188 2189 /** 2190 * Queries whether any threads are waiting on this condition. 2191 * Implements {@link AbstractQueuedSynchronizer#hasWaiters(ConditionObject)}. 2192 * 2193 * @return {@code true} if there are any waiting threads 2194 * @throws IllegalMonitorStateException if {@link #isHeldExclusively} 2195 * returns {@code false} 2196 */ 2197 protected final boolean hasWaiters() { 2198 if (!isHeldExclusively()) 2199 throw new IllegalMonitorStateException(); 2200 for (Node w = firstWaiter; w != null; w = w.nextWaiter) { 2201 if (w.waitStatus == Node.CONDITION) 2202 return true; 2203 } 2204 return false; 2205 } 2206 2207 /** 2208 * Returns an estimate of the number of threads waiting on 2209 * this condition. 2210 * Implements {@link AbstractQueuedSynchronizer#getWaitQueueLength(ConditionObject)}. 2211 * 2212 * @return the estimated number of waiting threads 2213 * @throws IllegalMonitorStateException if {@link #isHeldExclusively} 2214 * returns {@code false} 2215 */ 2216 protected final int getWaitQueueLength() { 2217 if (!isHeldExclusively()) 2218 throw new IllegalMonitorStateException(); 2219 int n = 0; 2220 for (Node w = firstWaiter; w != null; w = w.nextWaiter) { 2221 if (w.waitStatus == Node.CONDITION) 2222 ++n; 2223 } 2224 return n; 2225 } 2226 2227 /** 2228 * Returns a collection containing those threads that may be 2229 * waiting on this Condition. 2230 * Implements {@link AbstractQueuedSynchronizer#getWaitingThreads(ConditionObject)}. 2231 * 2232 * @return the collection of threads 2233 * @throws IllegalMonitorStateException if {@link #isHeldExclusively} 2234 * returns {@code false} 2235 */ 2236 protected final Collection<Thread> getWaitingThreads() { 2237 if (!isHeldExclusively()) 2238 throw new IllegalMonitorStateException(); 2239 ArrayList<Thread> list = new ArrayList<Thread>(); 2240 for (Node w = firstWaiter; w != null; w = w.nextWaiter) { 2241 if (w.waitStatus == Node.CONDITION) { 2242 Thread t = w.thread; 2243 if (t != null) 2244 list.add(t); 2245 } 2246 } 2247 return list; 2248 } 2249 } 2250 2251 /** 2252 * Setup to support compareAndSet. We need to natively implement 2253 * this here: For the sake of permitting future enhancements, we 2254 * cannot explicitly subclass AtomicInteger, which would be 2255 * efficient and useful otherwise. So, as the lesser of evils, we 2256 * natively implement using hotspot intrinsics API. And while we 2257 * are at it, we do the same for other CASable fields (which could 2258 * otherwise be done with atomic field updaters). 2259 */ 2260 private static final Unsafe unsafe = Unsafe.getUnsafe(); 2261 private static final long stateOffset; 2262 private static final long headOffset; 2263 private static final long tailOffset; 2264 private static final long waitStatusOffset; 2265 private static final long nextOffset; 2266 2267 static { 2268 try { 2269 stateOffset = unsafe.objectFieldOffset 2270 (AbstractQueuedSynchronizer.class.getDeclaredField("state")); 2271 headOffset = unsafe.objectFieldOffset 2272 (AbstractQueuedSynchronizer.class.getDeclaredField("head")); 2273 tailOffset = unsafe.objectFieldOffset 2274 (AbstractQueuedSynchronizer.class.getDeclaredField("tail")); 2275 waitStatusOffset = unsafe.objectFieldOffset 2276 (Node.class.getDeclaredField("waitStatus")); 2277 nextOffset = unsafe.objectFieldOffset 2278 (Node.class.getDeclaredField("next")); 2279 2280 } catch (Exception ex) { throw new Error(ex); } 2281 } 2282 2283 /** 2284 * CAS head field. Used only by enq. 2285 */ 2286 private final boolean compareAndSetHead(Node update) { 2287 return unsafe.compareAndSwapObject(this, headOffset, null, update); 2288 } 2289 2290 /** 2291 * CAS tail field. Used only by enq. 2292 */ 2293 private final boolean compareAndSetTail(Node expect, Node update) { 2294 return unsafe.compareAndSwapObject(this, tailOffset, expect, update); 2295 } 2296 2297 /** 2298 * CAS waitStatus field of a node. 2299 */ 2300 private static final boolean compareAndSetWaitStatus(Node node, 2301 int expect, 2302 int update) { 2303 return unsafe.compareAndSwapInt(node, waitStatusOffset, 2304 expect, update); 2305 } 2306 2307 /** 2308 * CAS next field of a node. 2309 */ 2310 private static final boolean compareAndSetNext(Node node, 2311 Node expect, 2312 Node update) { 2313 return unsafe.compareAndSwapObject(node, nextOffset, expect, update); 2314 } 2315 }
public abstract class AbstractOwnableSynchronizer implements java.io.Serializable { /** Use serial ID even though all fields transient. */ private static final long serialVersionUID = 3737899427754241961L; /** * Empty constructor for use by subclasses. */ protected AbstractOwnableSynchronizer() { } /** * 持有锁的线程 */ private transient Thread exclusiveOwnerThread; /** * 设置锁持有者 */ protected final void setExclusiveOwnerThread(Thread thread) { exclusiveOwnerThread = thread; } /** * 获取锁持有者 */ protected final Thread getExclusiveOwnerThread() { return exclusiveOwnerThread; } }
lock获锁 |
- CLH (Craig, Landin, and Hagersten)是一个虚拟的双向队列结构,AQS中只是保留了头部(head)和尾部(tail)
/** * Head of the wait queue, lazily initialized. Except for * initialization, it is modified only via method setHead. Note: * If head exists, its waitStatus is guaranteed not to be * CANCELLED. */ private transient volatile Node head; /** * Tail of the wait queue, lazily initialized. Modified only via * method enq to add new wait node. */ private transient volatile Node tail;
- CLH虚拟队列结构如下图
- volatile修饰的整形变量state标识锁的状态:state可大于1,以此来实现锁可重入(即获锁的线程允许再次获锁)
/** * 同步锁状态 */ private volatile int state; protected final int getState() { return state; } protected final void setState(int newState) { state = newState; } /** * cas原子性更新state */ protected final boolean compareAndSetState(int expect, int update) { return unsafe.compareAndSwapInt(this, stateOffset, expect, update); }
public void lock() { sync.lock(); }
(2)、sync为内部变量,构造ReentrantLock时根据参数创建公平锁和非公平锁,空参构造默认创建非公平锁。
/** Synchronizer providing all implementation mechanics */ private final Sync sync; /** * Creates an instance of {@code ReentrantLock}. * This is equivalent to using {@code ReentrantLock(false)}. */ public ReentrantLock() { sync = new NonfairSync(); } /** * Creates an instance of {@code ReentrantLock} with the * given fairness policy. * * @param fair {@code true} if this lock should use a fair ordering policy */ public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }
(3)、Sync抽象类继承自AbstractQueuedSynchronizer(AQS),NonFairSync和FairSync都继承自Sync实现非公平锁和公平锁机制。
/** * Base of synchronization control for this lock. Subclassed * into fair and nonfair versions below. Uses AQS state to * represent the number of holds on the lock. */ abstract static class Sync extends AbstractQueuedSynchronizer { final void lock() { acquire(1); } // ...... } /** * Sync object for non-fair locks */ static final class NonfairSync extends Sync { //...... } /** * Sync object for fair locks */ static final class FairSync extends Sync { // ...... }
(4)、先以FairSync为例,FairSync最终将调用AbstractQueuedSynchronizer#acquire(int arg)获锁
(其中arg参数即为获取锁的数量,要完全释放锁则获取多少数量,释放锁时必须释放对应数量)
public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); }
依次分析核心方法:
- tryAcquire(int arg):尝试获锁
- addWaiter(Node node):节点进入CLH等待队列
- acquireQueued(Node node, int arg):节点是否可以获锁,获取不到即阻塞等待
- selfInterrupt():自我产生中断
(4.1)、tryAcquire实现在FairSync内部。
/** * Sync object for fair locks */ static final class FairSync extends Sync { private static final long serialVersionUID = -3000897897090466540L; final void lock() { acquire(1); } /** * Fair version of tryAcquire. Don't grant access unless * recursive call or no waiters or is first. */ protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); // 获取锁状态 0表示锁无人占用 int c = getState(); if (c == 0) { // 此时无前继节点即代表当前节点在队列头部,则利用cas原子获锁 if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { // 利用AbstractOwnableSynchronizer提供的基础支持,设置当前线程为锁拥有者 setExclusiveOwnerThread(current); return true; } } // 锁可重入:锁拥有者可多次获取锁 else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } }
(4.2)、再来看看实现 AbstractQueuedSynchronizer#addWaiter(Node node) 节点入列的过程:
- CLH双向虚拟队列的节点Node类
static final class Node { /** 标识为分享模式 */ static final Node SHARED = new Node(); /** 标识为独占模式 */ static final Node EXCLUSIVE = null; /** 节点状态 0不表示属于以下任务状态 */ /** 表示当前节点已取消等待锁 */ static final int CANCELLED = 1; /** 表示当前节点需要唤醒状态,同时"后继节点"需要被阻塞 */ static final int SIGNAL = -1; /** 表示当前节点在等待Condition唤醒 */ static final int CONDITION = -2; /** 表示其它线程获取到“共享锁”,对应的waitStatus的值 */ static final int PROPAGATE = -3; volatile int waitStatus; /** * 前继节点 */ volatile Node prev; /** * 后继节点 */ volatile Node next; /** * 节点所对应的线程 */ volatile Thread thread; /** * nextWaiter是“区别当前CLH队列是 ‘独占锁’队列 还是 ‘共享锁’队列 的标记” * 若nextWaiter=SHARED,则CLH队列是“共享锁”队列; * 若nextWaiter=EXCLUSIVE,(即nextWaiter=null),则CLH队列是“独占锁”队列。 */ Node nextWaiter; final boolean isShared() { return nextWaiter == SHARED; } final Node predecessor() throws NullPointerException { Node p = prev; if (p == null) throw new NullPointerException(); else return p; } Node() { // Used to establish initial head or SHARED marker } Node(Thread thread, Node mode) { // Used by addWaiter this.nextWaiter = mode; this.thread = thread; } Node(Thread thread, int waitStatus) { // Used by Condition this.waitStatus = waitStatus; this.thread = thread; } }
- 入列逻辑:如队列不存在则会初始化,否则直接加入队尾。
/** * Creates and enqueues node for current thread and given mode. * * @param mode Node.EXCLUSIVE for exclusive, Node.SHARED for shared * @return the new node */ private Node addWaiter(Node mode) { // 根据mode判断队列模式的标志, Node node = new Node(Thread.currentThread(), mode); // Try the fast path of enq; backup to full enq on failure Node pred = tail; // 如果CLH队列非空,将节点插入队尾 if (pred != null) { node.prev = pred; // cas实现原子更新 if (compareAndSetTail(pred, node)) { pred.next = node; return node; } } // CLH队列为空将初始化队列 enq(node); return node; } private Node enq(final Node node) { for (;;) { Node t = tail; if (t == null) { // Must initialize if (compareAndSetHead(new Node())) tail = head; } else { node.prev = t; if (compareAndSetTail(t, node)) { t.next = node; return t; } } } }
(4.3)、AbstractQueuedSynchronizer#acquireQueued(final Node node, int arg) 节点尝试获锁,如获取不到即阻塞等待。等被唤醒的时,将会返回阻塞过程中是否曾被中断过的标记。
/** * Acquires in exclusive uninterruptible mode for thread already in * queue. Used by condition wait methods as well as acquire. * * @param node the node * @param arg the acquire argument * @return {@code true} if interrupted while waiting */ final boolean acquireQueued(final Node node, int arg) { boolean failed = true; try { boolean interrupted = false; for (;;) { // 当前节点已入列, 根据公平锁的原则判断当前节点前继p是否与head相等。 // 队列为带头双向链表:公平原则核心体现在”p == head“即代表node为第一个节点,具有获锁的权利,否则即使被唤醒也无权利获锁。 final Node p = node.predecessor(); if (p == head && tryAcquire(arg)) { setHead(node); p.next = null; // help GC failed = false; return interrupted; } // 获锁失败,判断当前节点是否需要被阻塞等待 // 1、阻塞,即将会等待其他线程调用LockSupport#unpark 或者 收到线程中断 唤醒 // 2、非阻塞,即再进入for死循环竞争锁 if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; } } finally { if (failed) cancelAcquire(node); } } private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) { // "前继节点"状态为Node.SIGNAL返回true 即表示当前节点将会被阻塞等待,等待"前继节点"释放锁,调用LockSupport#unpark唤醒 // 其余返回false int ws = pred.waitStatus; if (ws == Node.SIGNAL) return true; // 状态大于0即表示取消状态 if (ws > 0) { /* * 从pred开始往前遍历,清除掉ws>0 即已经取消状态的节点 */ do { node.prev = pred = pred.prev; } while (pred.waitStatus > 0); pred.next = node; } else { /* * 如果前继节点为“0”或者“共享锁”状态,则设置前继节点为SIGNAL状态。 * 此时需要调用者再次进入尝试,确认节点是否需要阻塞 */ compareAndSetWaitStatus(pred, ws, Node.SIGNAL); } return false; } private final boolean parkAndCheckInterrupt() { // 利用LockSupport辅助类将线程阻塞 LockSupport.park(this); // 判断状态:是否被因产生中断被唤醒,还是被LockSupport#unpark唤醒 return Thread.interrupted(); }
补充:被LockSupport#park阻塞的线程在几种情况下会被唤醒返回,因何种情况唤醒不得而知需要自我识别:
- 调用LockSupport#unpark唤醒
- 调用Thread#interrupt唤醒
- 调用者无理由返回唤醒
(4.4)、先看看AbstractQueuedSynchronizer#selfInterrupt()的代码实现
static void selfInterrupt() { // 当前线程自我产生中断标记 Thread.currentThread().interrupt(); }
为什么会在acquireQueued返回的时候还要自我产生中断呢?
- 首先,由于parkAndCheckInterrupt方法为了识别线程由于何种原因导致线程唤醒(一般为前两种情况的判断),会调用Thread.interrupted()方法,清除中断标记并返回。
- 其次,Thread.interrupted()清除了中断标记,将会导致后续线程操作无法识别到中断标记,所以在确定了被线程中断唤醒情况下,自己重新生成一个中断。
- 非公平锁NonFairSync和公平锁FairSync不同之处:如果锁未被占用则立即获取锁,不管节点是否为CLH队列头部。
/** * Sync object for non-fair locks */ static final class NonfairSync extends Sync { private static final long serialVersionUID = 7316153563782823691L; /** * 1、如锁未被占用,立即获取锁 * 2、获锁失败再次进入 AbstractQueuedSynchronizer#acquire方法 */ final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1); } protected final boolean tryAcquire(int acquires) { // 实现在Sync内部 return nonfairTryAcquire(acquires); } }
由于在分析公平锁FairSync已经分析过acquire方法,这里不再赘述。
- Sync#nonfairTryAcquire非公平锁实现:
abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = -5179523762034025860L; abstract void lock(); /** * Performs non-fair tryLock. tryAcquire is implemented in * subclasses, but both need nonfair try for trylock method. */ final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); // 非公平锁:如锁未被占用,立即获取锁 int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } // 锁可重入 else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } // ******** }
release释放锁 |
public void unlock() { sync.release(1); }
(2)、sync为内部变量,实际将调用AbstractQueuedSynchronizer#release释放锁
public final boolean release(int arg) { // 尝试释放锁 if (tryRelease(arg)) { // 获取锁的节点必定为CLH头节点 Node h = head; if (h != null && h.waitStatus != 0) // 唤醒其后继节点 unparkSuccessor(h); return true; } return false; }
将分为两个步骤:
- tryRelease: 尝试释放锁
- unparkSuccessor:唤醒CLH队列最靠近头节点的有效后继节点
(2.1)、Sync类方法tryRelease逻辑很明确,即 设置state状态、清除锁持有者线程为null
protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false; // 由于可重入功能,需要完全释放为0才实际释放锁 if (c == 0) { free = true; setExclusiveOwnerThread(null); } setState(c); return free; }
(2.2)、AbstractQueuedSynchronizer#unparkSuccessor方法唤醒继节点,即最靠近头节点的有效后继节点
private void unparkSuccessor(Node node) { /* * 如果当前节点状态为负数(意味着可能会被再次唤醒),因而设置该状态为0 * 节点状态修改可能失败或者被其他等待线程修改,但不影响逻辑。 */ int ws = node.waitStatus; if (ws < 0) compareAndSetWaitStatus(node, ws, 0); /* * 节点释放锁则唤醒队列的下一个节点, 即: * 1、下一个节点不为null 且 状态为非取消 即唤醒。 * 2、上述对Node节点分析, 下一个节点waitStatus>0表示为取消状态,此时从末尾遍历至node节点, * 找到最后一个非取消状态节点并唤醒,否则不做任何操作。 */ Node s = node.next; if (s == null || s.waitStatus > 0) { s = null; for (Node t = tail; t != null && t != node; t = t.prev) if (t.waitStatus <= 0) s = t; } if (s != null) LockSupport.unpark(s.thread); }
公平锁 和 非公平锁释放锁逻辑一致,只需分析一个即可。
来源:https://www.cnblogs.com/xiaoxing/p/12557323.html