1 /* 2 * Written by Doug Lea with assistance from members of JCP JSR-166 3 * Expert Group and released to the public domain, as explained at 4 * http://creativecommons.org/publicdomain/zero/1.0/ 5 * Other contributors include Andrew Wright, Jeffrey Hayes, 6 * Pat Fisher, Mike Judd. 7 */ 8 9 package jsr166; 10 11 import static java.util.concurrent.TimeUnit.MILLISECONDS; 12 13 import java.util.Arrays; 14 import java.util.Collection; 15 import java.util.HashSet; 16 import java.util.concurrent.CountDownLatch; 17 import java.util.concurrent.CyclicBarrier; 18 import java.util.concurrent.locks.Condition; 19 import java.util.concurrent.locks.ReentrantLock; 20 21 import junit.framework.AssertionFailedError; 22 import junit.framework.Test; 23 import junit.framework.TestSuite; 24 25 public class ReentrantLockTest extends JSR166TestCase { 26 // android-note: Removed because the CTS runner does a bad job of 27 // retrying tests that have suite() declarations. 28 // 29 // public static void main(String[] args) { 30 // main(suite(), args); 31 // } 32 // public static Test suite() { 33 // return new TestSuite(...); 34 // } 35 /** 36 * A checked runnable calling lockInterruptibly 37 */ 38 class InterruptibleLockRunnable extends CheckedRunnable { 39 final ReentrantLock lock; 40 InterruptibleLockRunnable(ReentrantLock lock) { this.lock = lock; } 41 public void realRun() throws InterruptedException { 42 lock.lockInterruptibly(); 43 } 44 } 45 46 /** 47 * A checked runnable calling lockInterruptibly that expects to be 48 * interrupted 49 */ 50 class InterruptedLockRunnable extends CheckedInterruptedRunnable { 51 final ReentrantLock lock; 52 InterruptedLockRunnable(ReentrantLock lock) { this.lock = lock; } 53 public void realRun() throws InterruptedException { 54 lock.lockInterruptibly(); 55 } 56 } 57 58 /** 59 * Subclass to expose protected methods 60 */ 61 static class PublicReentrantLock extends ReentrantLock { 62 PublicReentrantLock() { super(); } 63 PublicReentrantLock(boolean fair) { super(fair); } 64 public Thread getOwner() { 65 return super.getOwner(); 66 } 67 public Collection<Thread> getQueuedThreads() { 68 return super.getQueuedThreads(); 69 } 70 public Collection<Thread> getWaitingThreads(Condition c) { 71 return super.getWaitingThreads(c); 72 } 73 } 74 75 /** 76 * Releases write lock, checking that it had a hold count of 1. 77 */ 78 void releaseLock(PublicReentrantLock lock) { 79 assertLockedByMoi(lock); 80 lock.unlock(); 81 assertFalse(lock.isHeldByCurrentThread()); 82 assertNotLocked(lock); 83 } 84 85 /** 86 * Spin-waits until lock.hasQueuedThread(t) becomes true. 87 */ 88 void waitForQueuedThread(PublicReentrantLock lock, Thread t) { 89 long startTime = System.nanoTime(); 90 while (!lock.hasQueuedThread(t)) { 91 if (millisElapsedSince(startTime) > LONG_DELAY_MS) 92 throw new AssertionFailedError("timed out"); 93 Thread.yield(); 94 } 95 assertTrue(t.isAlive()); 96 assertNotSame(t, lock.getOwner()); 97 } 98 99 /** 100 * Checks that lock is not locked. 101 */ 102 void assertNotLocked(PublicReentrantLock lock) { 103 assertFalse(lock.isLocked()); 104 assertFalse(lock.isHeldByCurrentThread()); 105 assertNull(lock.getOwner()); 106 assertEquals(0, lock.getHoldCount()); 107 } 108 109 /** 110 * Checks that lock is locked by the given thread. 111 */ 112 void assertLockedBy(PublicReentrantLock lock, Thread t) { 113 assertTrue(lock.isLocked()); 114 assertSame(t, lock.getOwner()); 115 assertEquals(t == Thread.currentThread(), 116 lock.isHeldByCurrentThread()); 117 assertEquals(t == Thread.currentThread(), 118 lock.getHoldCount() > 0); 119 } 120 121 /** 122 * Checks that lock is locked by the current thread. 123 */ 124 void assertLockedByMoi(PublicReentrantLock lock) { 125 assertLockedBy(lock, Thread.currentThread()); 126 } 127 128 /** 129 * Checks that condition c has no waiters. 130 */ 131 void assertHasNoWaiters(PublicReentrantLock lock, Condition c) { 132 assertHasWaiters(lock, c, new Thread[] {}); 133 } 134 135 /** 136 * Checks that condition c has exactly the given waiter threads. 137 */ 138 void assertHasWaiters(PublicReentrantLock lock, Condition c, 139 Thread... threads) { 140 lock.lock(); 141 assertEquals(threads.length > 0, lock.hasWaiters(c)); 142 assertEquals(threads.length, lock.getWaitQueueLength(c)); 143 assertEquals(threads.length == 0, lock.getWaitingThreads(c).isEmpty()); 144 assertEquals(threads.length, lock.getWaitingThreads(c).size()); 145 assertEquals(new HashSet<Thread>(lock.getWaitingThreads(c)), 146 new HashSet<Thread>(Arrays.asList(threads))); 147 lock.unlock(); 148 } 149 150 enum AwaitMethod { await, awaitTimed, awaitNanos, awaitUntil } 151 152 /** 153 * Awaits condition using the specified AwaitMethod. 154 */ 155 void await(Condition c, AwaitMethod awaitMethod) 156 throws InterruptedException { 157 long timeoutMillis = 2 * LONG_DELAY_MS; 158 switch (awaitMethod) { 159 case await: 160 c.await(); 161 break; 162 case awaitTimed: 163 assertTrue(c.await(timeoutMillis, MILLISECONDS)); 164 break; 165 case awaitNanos: 166 long nanosTimeout = MILLISECONDS.toNanos(timeoutMillis); 167 long nanosRemaining = c.awaitNanos(nanosTimeout); 168 assertTrue(nanosRemaining > 0); 169 break; 170 case awaitUntil: 171 assertTrue(c.awaitUntil(delayedDate(timeoutMillis))); 172 break; 173 default: 174 throw new AssertionError(); 175 } 176 } 177 178 /** 179 * Constructor sets given fairness, and is in unlocked state 180 */ 181 public void testConstructor() { 182 PublicReentrantLock lock; 183 184 lock = new PublicReentrantLock(); 185 assertFalse(lock.isFair()); 186 assertNotLocked(lock); 187 188 lock = new PublicReentrantLock(true); 189 assertTrue(lock.isFair()); 190 assertNotLocked(lock); 191 192 lock = new PublicReentrantLock(false); 193 assertFalse(lock.isFair()); 194 assertNotLocked(lock); 195 } 196 197 /** 198 * locking an unlocked lock succeeds 199 */ 200 public void testLock() { testLock(false); } 201 public void testLock_fair() { testLock(true); } 202 public void testLock(boolean fair) { 203 PublicReentrantLock lock = new PublicReentrantLock(fair); 204 lock.lock(); 205 assertLockedByMoi(lock); 206 releaseLock(lock); 207 } 208 209 /** 210 * Unlocking an unlocked lock throws IllegalMonitorStateException 211 */ 212 public void testUnlock_IMSE() { testUnlock_IMSE(false); } 213 public void testUnlock_IMSE_fair() { testUnlock_IMSE(true); } 214 public void testUnlock_IMSE(boolean fair) { 215 ReentrantLock lock = new ReentrantLock(fair); 216 try { 217 lock.unlock(); 218 shouldThrow(); 219 } catch (IllegalMonitorStateException success) {} 220 } 221 222 /** 223 * tryLock on an unlocked lock succeeds 224 */ 225 public void testTryLock() { testTryLock(false); } 226 public void testTryLock_fair() { testTryLock(true); } 227 public void testTryLock(boolean fair) { 228 PublicReentrantLock lock = new PublicReentrantLock(fair); 229 assertTrue(lock.tryLock()); 230 assertLockedByMoi(lock); 231 assertTrue(lock.tryLock()); 232 assertLockedByMoi(lock); 233 lock.unlock(); 234 releaseLock(lock); 235 } 236 237 /** 238 * hasQueuedThreads reports whether there are waiting threads 239 */ 240 public void testHasQueuedThreads() { testHasQueuedThreads(false); } 241 public void testHasQueuedThreads_fair() { testHasQueuedThreads(true); } 242 public void testHasQueuedThreads(boolean fair) { 243 final PublicReentrantLock lock = new PublicReentrantLock(fair); 244 Thread t1 = new Thread(new InterruptedLockRunnable(lock)); 245 Thread t2 = new Thread(new InterruptibleLockRunnable(lock)); 246 assertFalse(lock.hasQueuedThreads()); 247 lock.lock(); 248 assertFalse(lock.hasQueuedThreads()); 249 t1.start(); 250 waitForQueuedThread(lock, t1); 251 assertTrue(lock.hasQueuedThreads()); 252 t2.start(); 253 waitForQueuedThread(lock, t2); 254 assertTrue(lock.hasQueuedThreads()); 255 t1.interrupt(); 256 awaitTermination(t1); 257 assertTrue(lock.hasQueuedThreads()); 258 lock.unlock(); 259 awaitTermination(t2); 260 assertFalse(lock.hasQueuedThreads()); 261 } 262 263 /** 264 * getQueueLength reports number of waiting threads 265 */ 266 public void testGetQueueLength() { testGetQueueLength(false); } 267 public void testGetQueueLength_fair() { testGetQueueLength(true); } 268 public void testGetQueueLength(boolean fair) { 269 final PublicReentrantLock lock = new PublicReentrantLock(fair); 270 Thread t1 = new Thread(new InterruptedLockRunnable(lock)); 271 Thread t2 = new Thread(new InterruptibleLockRunnable(lock)); 272 assertEquals(0, lock.getQueueLength()); 273 lock.lock(); 274 t1.start(); 275 waitForQueuedThread(lock, t1); 276 assertEquals(1, lock.getQueueLength()); 277 t2.start(); 278 waitForQueuedThread(lock, t2); 279 assertEquals(2, lock.getQueueLength()); 280 t1.interrupt(); 281 awaitTermination(t1); 282 assertEquals(1, lock.getQueueLength()); 283 lock.unlock(); 284 awaitTermination(t2); 285 assertEquals(0, lock.getQueueLength()); 286 } 287 288 /** 289 * hasQueuedThread(null) throws NPE 290 */ 291 public void testHasQueuedThreadNPE() { testHasQueuedThreadNPE(false); } 292 public void testHasQueuedThreadNPE_fair() { testHasQueuedThreadNPE(true); } 293 public void testHasQueuedThreadNPE(boolean fair) { 294 final ReentrantLock lock = new ReentrantLock(fair); 295 try { 296 lock.hasQueuedThread(null); 297 shouldThrow(); 298 } catch (NullPointerException success) {} 299 } 300 301 /** 302 * hasQueuedThread reports whether a thread is queued 303 */ 304 public void testHasQueuedThread() { testHasQueuedThread(false); } 305 public void testHasQueuedThread_fair() { testHasQueuedThread(true); } 306 public void testHasQueuedThread(boolean fair) { 307 final PublicReentrantLock lock = new PublicReentrantLock(fair); 308 Thread t1 = new Thread(new InterruptedLockRunnable(lock)); 309 Thread t2 = new Thread(new InterruptibleLockRunnable(lock)); 310 assertFalse(lock.hasQueuedThread(t1)); 311 assertFalse(lock.hasQueuedThread(t2)); 312 lock.lock(); 313 t1.start(); 314 waitForQueuedThread(lock, t1); 315 assertTrue(lock.hasQueuedThread(t1)); 316 assertFalse(lock.hasQueuedThread(t2)); 317 t2.start(); 318 waitForQueuedThread(lock, t2); 319 assertTrue(lock.hasQueuedThread(t1)); 320 assertTrue(lock.hasQueuedThread(t2)); 321 t1.interrupt(); 322 awaitTermination(t1); 323 assertFalse(lock.hasQueuedThread(t1)); 324 assertTrue(lock.hasQueuedThread(t2)); 325 lock.unlock(); 326 awaitTermination(t2); 327 assertFalse(lock.hasQueuedThread(t1)); 328 assertFalse(lock.hasQueuedThread(t2)); 329 } 330 331 /** 332 * getQueuedThreads includes waiting threads 333 */ 334 public void testGetQueuedThreads() { testGetQueuedThreads(false); } 335 public void testGetQueuedThreads_fair() { testGetQueuedThreads(true); } 336 public void testGetQueuedThreads(boolean fair) { 337 final PublicReentrantLock lock = new PublicReentrantLock(fair); 338 Thread t1 = new Thread(new InterruptedLockRunnable(lock)); 339 Thread t2 = new Thread(new InterruptibleLockRunnable(lock)); 340 assertTrue(lock.getQueuedThreads().isEmpty()); 341 lock.lock(); 342 assertTrue(lock.getQueuedThreads().isEmpty()); 343 t1.start(); 344 waitForQueuedThread(lock, t1); 345 assertEquals(1, lock.getQueuedThreads().size()); 346 assertTrue(lock.getQueuedThreads().contains(t1)); 347 t2.start(); 348 waitForQueuedThread(lock, t2); 349 assertEquals(2, lock.getQueuedThreads().size()); 350 assertTrue(lock.getQueuedThreads().contains(t1)); 351 assertTrue(lock.getQueuedThreads().contains(t2)); 352 t1.interrupt(); 353 awaitTermination(t1); 354 assertFalse(lock.getQueuedThreads().contains(t1)); 355 assertTrue(lock.getQueuedThreads().contains(t2)); 356 assertEquals(1, lock.getQueuedThreads().size()); 357 lock.unlock(); 358 awaitTermination(t2); 359 assertTrue(lock.getQueuedThreads().isEmpty()); 360 } 361 362 /** 363 * timed tryLock is interruptible 364 */ 365 public void testTryLock_Interruptible() { testTryLock_Interruptible(false); } 366 public void testTryLock_Interruptible_fair() { testTryLock_Interruptible(true); } 367 public void testTryLock_Interruptible(boolean fair) { 368 final PublicReentrantLock lock = new PublicReentrantLock(fair); 369 lock.lock(); 370 Thread t = newStartedThread(new CheckedInterruptedRunnable() { 371 public void realRun() throws InterruptedException { 372 lock.tryLock(2 * LONG_DELAY_MS, MILLISECONDS); 373 }}); 374 375 waitForQueuedThread(lock, t); 376 t.interrupt(); 377 awaitTermination(t); 378 releaseLock(lock); 379 } 380 381 /** 382 * tryLock on a locked lock fails 383 */ 384 public void testTryLockWhenLocked() { testTryLockWhenLocked(false); } 385 public void testTryLockWhenLocked_fair() { testTryLockWhenLocked(true); } 386 public void testTryLockWhenLocked(boolean fair) { 387 final PublicReentrantLock lock = new PublicReentrantLock(fair); 388 lock.lock(); 389 Thread t = newStartedThread(new CheckedRunnable() { 390 public void realRun() { 391 assertFalse(lock.tryLock()); 392 }}); 393 394 awaitTermination(t); 395 releaseLock(lock); 396 } 397 398 /** 399 * Timed tryLock on a locked lock times out 400 */ 401 public void testTryLock_Timeout() { testTryLock_Timeout(false); } 402 public void testTryLock_Timeout_fair() { testTryLock_Timeout(true); } 403 public void testTryLock_Timeout(boolean fair) { 404 final PublicReentrantLock lock = new PublicReentrantLock(fair); 405 lock.lock(); 406 Thread t = newStartedThread(new CheckedRunnable() { 407 public void realRun() throws InterruptedException { 408 long startTime = System.nanoTime(); 409 long timeoutMillis = 10; 410 assertFalse(lock.tryLock(timeoutMillis, MILLISECONDS)); 411 assertTrue(millisElapsedSince(startTime) >= timeoutMillis); 412 }}); 413 414 awaitTermination(t); 415 releaseLock(lock); 416 } 417 418 /** 419 * getHoldCount returns number of recursive holds 420 */ 421 public void testGetHoldCount() { testGetHoldCount(false); } 422 public void testGetHoldCount_fair() { testGetHoldCount(true); } 423 public void testGetHoldCount(boolean fair) { 424 ReentrantLock lock = new ReentrantLock(fair); 425 for (int i = 1; i <= SIZE; i++) { 426 lock.lock(); 427 assertEquals(i, lock.getHoldCount()); 428 } 429 for (int i = SIZE; i > 0; i--) { 430 lock.unlock(); 431 assertEquals(i-1, lock.getHoldCount()); 432 } 433 } 434 435 /** 436 * isLocked is true when locked and false when not 437 */ 438 public void testIsLocked() { testIsLocked(false); } 439 public void testIsLocked_fair() { testIsLocked(true); } 440 public void testIsLocked(boolean fair) { 441 try { 442 final ReentrantLock lock = new ReentrantLock(fair); 443 assertFalse(lock.isLocked()); 444 lock.lock(); 445 assertTrue(lock.isLocked()); 446 lock.lock(); 447 assertTrue(lock.isLocked()); 448 lock.unlock(); 449 assertTrue(lock.isLocked()); 450 lock.unlock(); 451 assertFalse(lock.isLocked()); 452 final CyclicBarrier barrier = new CyclicBarrier(2); 453 Thread t = newStartedThread(new CheckedRunnable() { 454 public void realRun() throws Exception { 455 lock.lock(); 456 assertTrue(lock.isLocked()); 457 barrier.await(); 458 barrier.await(); 459 lock.unlock(); 460 }}); 461 462 barrier.await(); 463 assertTrue(lock.isLocked()); 464 barrier.await(); 465 awaitTermination(t); 466 assertFalse(lock.isLocked()); 467 } catch (Exception fail) { threadUnexpectedException(fail); } 468 } 469 470 /** 471 * lockInterruptibly succeeds when unlocked, else is interruptible 472 */ 473 public void testLockInterruptibly() { testLockInterruptibly(false); } 474 public void testLockInterruptibly_fair() { testLockInterruptibly(true); } 475 public void testLockInterruptibly(boolean fair) { 476 final PublicReentrantLock lock = new PublicReentrantLock(fair); 477 try { 478 lock.lockInterruptibly(); 479 } catch (InterruptedException fail) { threadUnexpectedException(fail); } 480 assertLockedByMoi(lock); 481 Thread t = newStartedThread(new InterruptedLockRunnable(lock)); 482 waitForQueuedThread(lock, t); 483 t.interrupt(); 484 assertTrue(lock.isLocked()); 485 assertTrue(lock.isHeldByCurrentThread()); 486 awaitTermination(t); 487 releaseLock(lock); 488 } 489 490 /** 491 * Calling await without holding lock throws IllegalMonitorStateException 492 */ 493 public void testAwait_IMSE() { testAwait_IMSE(false); } 494 public void testAwait_IMSE_fair() { testAwait_IMSE(true); } 495 public void testAwait_IMSE(boolean fair) { 496 final ReentrantLock lock = new ReentrantLock(fair); 497 final Condition c = lock.newCondition(); 498 for (AwaitMethod awaitMethod : AwaitMethod.values()) { 499 long startTime = System.nanoTime(); 500 try { 501 await(c, awaitMethod); 502 shouldThrow(); 503 } catch (IllegalMonitorStateException success) { 504 } catch (InterruptedException e) { threadUnexpectedException(e); } 505 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 506 } 507 } 508 509 /** 510 * Calling signal without holding lock throws IllegalMonitorStateException 511 */ 512 public void testSignal_IMSE() { testSignal_IMSE(false); } 513 public void testSignal_IMSE_fair() { testSignal_IMSE(true); } 514 public void testSignal_IMSE(boolean fair) { 515 final ReentrantLock lock = new ReentrantLock(fair); 516 final Condition c = lock.newCondition(); 517 try { 518 c.signal(); 519 shouldThrow(); 520 } catch (IllegalMonitorStateException success) {} 521 } 522 523 /** 524 * awaitNanos without a signal times out 525 */ 526 public void testAwaitNanos_Timeout() { testAwaitNanos_Timeout(false); } 527 public void testAwaitNanos_Timeout_fair() { testAwaitNanos_Timeout(true); } 528 public void testAwaitNanos_Timeout(boolean fair) { 529 try { 530 final ReentrantLock lock = new ReentrantLock(fair); 531 final Condition c = lock.newCondition(); 532 lock.lock(); 533 long startTime = System.nanoTime(); 534 long timeoutMillis = 10; 535 long timeoutNanos = MILLISECONDS.toNanos(timeoutMillis); 536 long nanosRemaining = c.awaitNanos(timeoutNanos); 537 assertTrue(nanosRemaining <= 0); 538 assertTrue(millisElapsedSince(startTime) >= timeoutMillis); 539 lock.unlock(); 540 } catch (InterruptedException fail) { threadUnexpectedException(fail); } 541 } 542 543 /** 544 * timed await without a signal times out 545 */ 546 public void testAwait_Timeout() { testAwait_Timeout(false); } 547 public void testAwait_Timeout_fair() { testAwait_Timeout(true); } 548 public void testAwait_Timeout(boolean fair) { 549 try { 550 final ReentrantLock lock = new ReentrantLock(fair); 551 final Condition c = lock.newCondition(); 552 lock.lock(); 553 long startTime = System.nanoTime(); 554 long timeoutMillis = 10; 555 assertFalse(c.await(timeoutMillis, MILLISECONDS)); 556 assertTrue(millisElapsedSince(startTime) >= timeoutMillis); 557 lock.unlock(); 558 } catch (InterruptedException fail) { threadUnexpectedException(fail); } 559 } 560 561 /** 562 * awaitUntil without a signal times out 563 */ 564 public void testAwaitUntil_Timeout() { testAwaitUntil_Timeout(false); } 565 public void testAwaitUntil_Timeout_fair() { testAwaitUntil_Timeout(true); } 566 public void testAwaitUntil_Timeout(boolean fair) { 567 try { 568 final ReentrantLock lock = new ReentrantLock(fair); 569 final Condition c = lock.newCondition(); 570 lock.lock(); 571 long startTime = System.nanoTime(); 572 long timeoutMillis = 10; 573 java.util.Date d = new java.util.Date(); 574 assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + timeoutMillis))); 575 assertTrue(millisElapsedSince(startTime) >= timeoutMillis); 576 lock.unlock(); 577 } catch (InterruptedException fail) { threadUnexpectedException(fail); } 578 } 579 580 /** 581 * await returns when signalled 582 */ 583 public void testAwait() { testAwait(false); } 584 public void testAwait_fair() { testAwait(true); } 585 public void testAwait(boolean fair) { 586 final PublicReentrantLock lock = new PublicReentrantLock(fair); 587 final Condition c = lock.newCondition(); 588 final CountDownLatch locked = new CountDownLatch(1); 589 Thread t = newStartedThread(new CheckedRunnable() { 590 public void realRun() throws InterruptedException { 591 lock.lock(); 592 locked.countDown(); 593 c.await(); 594 lock.unlock(); 595 }}); 596 597 await(locked); 598 lock.lock(); 599 assertHasWaiters(lock, c, t); 600 c.signal(); 601 assertHasNoWaiters(lock, c); 602 assertTrue(t.isAlive()); 603 lock.unlock(); 604 awaitTermination(t); 605 } 606 607 /** 608 * hasWaiters throws NPE if null 609 */ 610 public void testHasWaitersNPE() { testHasWaitersNPE(false); } 611 public void testHasWaitersNPE_fair() { testHasWaitersNPE(true); } 612 public void testHasWaitersNPE(boolean fair) { 613 final ReentrantLock lock = new ReentrantLock(fair); 614 try { 615 lock.hasWaiters(null); 616 shouldThrow(); 617 } catch (NullPointerException success) {} 618 } 619 620 /** 621 * getWaitQueueLength throws NPE if null 622 */ 623 public void testGetWaitQueueLengthNPE() { testGetWaitQueueLengthNPE(false); } 624 public void testGetWaitQueueLengthNPE_fair() { testGetWaitQueueLengthNPE(true); } 625 public void testGetWaitQueueLengthNPE(boolean fair) { 626 final ReentrantLock lock = new ReentrantLock(fair); 627 try { 628 lock.getWaitQueueLength(null); 629 shouldThrow(); 630 } catch (NullPointerException success) {} 631 } 632 633 /** 634 * getWaitingThreads throws NPE if null 635 */ 636 public void testGetWaitingThreadsNPE() { testGetWaitingThreadsNPE(false); } 637 public void testGetWaitingThreadsNPE_fair() { testGetWaitingThreadsNPE(true); } 638 public void testGetWaitingThreadsNPE(boolean fair) { 639 final PublicReentrantLock lock = new PublicReentrantLock(fair); 640 try { 641 lock.getWaitingThreads(null); 642 shouldThrow(); 643 } catch (NullPointerException success) {} 644 } 645 646 /** 647 * hasWaiters throws IllegalArgumentException if not owned 648 */ 649 public void testHasWaitersIAE() { testHasWaitersIAE(false); } 650 public void testHasWaitersIAE_fair() { testHasWaitersIAE(true); } 651 public void testHasWaitersIAE(boolean fair) { 652 final ReentrantLock lock = new ReentrantLock(fair); 653 final Condition c = lock.newCondition(); 654 final ReentrantLock lock2 = new ReentrantLock(fair); 655 try { 656 lock2.hasWaiters(c); 657 shouldThrow(); 658 } catch (IllegalArgumentException success) {} 659 } 660 661 /** 662 * hasWaiters throws IllegalMonitorStateException if not locked 663 */ 664 public void testHasWaitersIMSE() { testHasWaitersIMSE(false); } 665 public void testHasWaitersIMSE_fair() { testHasWaitersIMSE(true); } 666 public void testHasWaitersIMSE(boolean fair) { 667 final ReentrantLock lock = new ReentrantLock(fair); 668 final Condition c = lock.newCondition(); 669 try { 670 lock.hasWaiters(c); 671 shouldThrow(); 672 } catch (IllegalMonitorStateException success) {} 673 } 674 675 /** 676 * getWaitQueueLength throws IllegalArgumentException if not owned 677 */ 678 public void testGetWaitQueueLengthIAE() { testGetWaitQueueLengthIAE(false); } 679 public void testGetWaitQueueLengthIAE_fair() { testGetWaitQueueLengthIAE(true); } 680 public void testGetWaitQueueLengthIAE(boolean fair) { 681 final ReentrantLock lock = new ReentrantLock(fair); 682 final Condition c = lock.newCondition(); 683 final ReentrantLock lock2 = new ReentrantLock(fair); 684 try { 685 lock2.getWaitQueueLength(c); 686 shouldThrow(); 687 } catch (IllegalArgumentException success) {} 688 } 689 690 /** 691 * getWaitQueueLength throws IllegalMonitorStateException if not locked 692 */ 693 public void testGetWaitQueueLengthIMSE() { testGetWaitQueueLengthIMSE(false); } 694 public void testGetWaitQueueLengthIMSE_fair() { testGetWaitQueueLengthIMSE(true); } 695 public void testGetWaitQueueLengthIMSE(boolean fair) { 696 final ReentrantLock lock = new ReentrantLock(fair); 697 final Condition c = lock.newCondition(); 698 try { 699 lock.getWaitQueueLength(c); 700 shouldThrow(); 701 } catch (IllegalMonitorStateException success) {} 702 } 703 704 /** 705 * getWaitingThreads throws IllegalArgumentException if not owned 706 */ 707 public void testGetWaitingThreadsIAE() { testGetWaitingThreadsIAE(false); } 708 public void testGetWaitingThreadsIAE_fair() { testGetWaitingThreadsIAE(true); } 709 public void testGetWaitingThreadsIAE(boolean fair) { 710 final PublicReentrantLock lock = new PublicReentrantLock(fair); 711 final Condition c = lock.newCondition(); 712 final PublicReentrantLock lock2 = new PublicReentrantLock(fair); 713 try { 714 lock2.getWaitingThreads(c); 715 shouldThrow(); 716 } catch (IllegalArgumentException success) {} 717 } 718 719 /** 720 * getWaitingThreads throws IllegalMonitorStateException if not locked 721 */ 722 public void testGetWaitingThreadsIMSE() { testGetWaitingThreadsIMSE(false); } 723 public void testGetWaitingThreadsIMSE_fair() { testGetWaitingThreadsIMSE(true); } 724 public void testGetWaitingThreadsIMSE(boolean fair) { 725 final PublicReentrantLock lock = new PublicReentrantLock(fair); 726 final Condition c = lock.newCondition(); 727 try { 728 lock.getWaitingThreads(c); 729 shouldThrow(); 730 } catch (IllegalMonitorStateException success) {} 731 } 732 733 /** 734 * hasWaiters returns true when a thread is waiting, else false 735 */ 736 public void testHasWaiters() { testHasWaiters(false); } 737 public void testHasWaiters_fair() { testHasWaiters(true); } 738 public void testHasWaiters(boolean fair) { 739 final PublicReentrantLock lock = new PublicReentrantLock(fair); 740 final Condition c = lock.newCondition(); 741 final CountDownLatch pleaseSignal = new CountDownLatch(1); 742 Thread t = newStartedThread(new CheckedRunnable() { 743 public void realRun() throws InterruptedException { 744 lock.lock(); 745 assertHasNoWaiters(lock, c); 746 assertFalse(lock.hasWaiters(c)); 747 pleaseSignal.countDown(); 748 c.await(); 749 assertHasNoWaiters(lock, c); 750 assertFalse(lock.hasWaiters(c)); 751 lock.unlock(); 752 }}); 753 754 await(pleaseSignal); 755 lock.lock(); 756 assertHasWaiters(lock, c, t); 757 assertTrue(lock.hasWaiters(c)); 758 c.signal(); 759 assertHasNoWaiters(lock, c); 760 assertFalse(lock.hasWaiters(c)); 761 lock.unlock(); 762 awaitTermination(t); 763 assertHasNoWaiters(lock, c); 764 } 765 766 /** 767 * getWaitQueueLength returns number of waiting threads 768 */ 769 public void testGetWaitQueueLength() { testGetWaitQueueLength(false); } 770 public void testGetWaitQueueLength_fair() { testGetWaitQueueLength(true); } 771 public void testGetWaitQueueLength(boolean fair) { 772 final PublicReentrantLock lock = new PublicReentrantLock(fair); 773 final Condition c = lock.newCondition(); 774 final CountDownLatch locked1 = new CountDownLatch(1); 775 final CountDownLatch locked2 = new CountDownLatch(1); 776 Thread t1 = new Thread(new CheckedRunnable() { 777 public void realRun() throws InterruptedException { 778 lock.lock(); 779 assertFalse(lock.hasWaiters(c)); 780 assertEquals(0, lock.getWaitQueueLength(c)); 781 locked1.countDown(); 782 c.await(); 783 lock.unlock(); 784 }}); 785 786 Thread t2 = new Thread(new CheckedRunnable() { 787 public void realRun() throws InterruptedException { 788 lock.lock(); 789 assertTrue(lock.hasWaiters(c)); 790 assertEquals(1, lock.getWaitQueueLength(c)); 791 locked2.countDown(); 792 c.await(); 793 lock.unlock(); 794 }}); 795 796 lock.lock(); 797 assertEquals(0, lock.getWaitQueueLength(c)); 798 lock.unlock(); 799 800 t1.start(); 801 await(locked1); 802 803 lock.lock(); 804 assertHasWaiters(lock, c, t1); 805 assertEquals(1, lock.getWaitQueueLength(c)); 806 lock.unlock(); 807 808 t2.start(); 809 await(locked2); 810 811 lock.lock(); 812 assertHasWaiters(lock, c, t1, t2); 813 assertEquals(2, lock.getWaitQueueLength(c)); 814 c.signalAll(); 815 assertHasNoWaiters(lock, c); 816 lock.unlock(); 817 818 awaitTermination(t1); 819 awaitTermination(t2); 820 821 assertHasNoWaiters(lock, c); 822 } 823 824 /** 825 * getWaitingThreads returns only and all waiting threads 826 */ 827 public void testGetWaitingThreads() { testGetWaitingThreads(false); } 828 public void testGetWaitingThreads_fair() { testGetWaitingThreads(true); } 829 public void testGetWaitingThreads(boolean fair) { 830 final PublicReentrantLock lock = new PublicReentrantLock(fair); 831 final Condition c = lock.newCondition(); 832 final CountDownLatch locked1 = new CountDownLatch(1); 833 final CountDownLatch locked2 = new CountDownLatch(1); 834 Thread t1 = new Thread(new CheckedRunnable() { 835 public void realRun() throws InterruptedException { 836 lock.lock(); 837 assertTrue(lock.getWaitingThreads(c).isEmpty()); 838 locked1.countDown(); 839 c.await(); 840 lock.unlock(); 841 }}); 842 843 Thread t2 = new Thread(new CheckedRunnable() { 844 public void realRun() throws InterruptedException { 845 lock.lock(); 846 assertFalse(lock.getWaitingThreads(c).isEmpty()); 847 locked2.countDown(); 848 c.await(); 849 lock.unlock(); 850 }}); 851 852 lock.lock(); 853 assertTrue(lock.getWaitingThreads(c).isEmpty()); 854 lock.unlock(); 855 856 t1.start(); 857 await(locked1); 858 859 lock.lock(); 860 assertHasWaiters(lock, c, t1); 861 assertTrue(lock.getWaitingThreads(c).contains(t1)); 862 assertFalse(lock.getWaitingThreads(c).contains(t2)); 863 assertEquals(1, lock.getWaitingThreads(c).size()); 864 lock.unlock(); 865 866 t2.start(); 867 await(locked2); 868 869 lock.lock(); 870 assertHasWaiters(lock, c, t1, t2); 871 assertTrue(lock.getWaitingThreads(c).contains(t1)); 872 assertTrue(lock.getWaitingThreads(c).contains(t2)); 873 assertEquals(2, lock.getWaitingThreads(c).size()); 874 c.signalAll(); 875 assertHasNoWaiters(lock, c); 876 lock.unlock(); 877 878 awaitTermination(t1); 879 awaitTermination(t2); 880 881 assertHasNoWaiters(lock, c); 882 } 883 884 /** 885 * awaitUninterruptibly is uninterruptible 886 */ 887 public void testAwaitUninterruptibly() { testAwaitUninterruptibly(false); } 888 public void testAwaitUninterruptibly_fair() { testAwaitUninterruptibly(true); } 889 public void testAwaitUninterruptibly(boolean fair) { 890 final ReentrantLock lock = new ReentrantLock(fair); 891 final Condition c = lock.newCondition(); 892 final CountDownLatch pleaseInterrupt = new CountDownLatch(2); 893 894 Thread t1 = newStartedThread(new CheckedRunnable() { 895 public void realRun() { 896 // Interrupt before awaitUninterruptibly 897 lock.lock(); 898 pleaseInterrupt.countDown(); 899 Thread.currentThread().interrupt(); 900 c.awaitUninterruptibly(); 901 assertTrue(Thread.interrupted()); 902 lock.unlock(); 903 }}); 904 905 Thread t2 = newStartedThread(new CheckedRunnable() { 906 public void realRun() { 907 // Interrupt during awaitUninterruptibly 908 lock.lock(); 909 pleaseInterrupt.countDown(); 910 c.awaitUninterruptibly(); 911 assertTrue(Thread.interrupted()); 912 lock.unlock(); 913 }}); 914 915 await(pleaseInterrupt); 916 lock.lock(); 917 lock.unlock(); 918 t2.interrupt(); 919 920 assertThreadStaysAlive(t1); 921 assertTrue(t2.isAlive()); 922 923 lock.lock(); 924 c.signalAll(); 925 lock.unlock(); 926 927 awaitTermination(t1); 928 awaitTermination(t2); 929 } 930 931 /** 932 * await/awaitNanos/awaitUntil is interruptible 933 */ 934 public void testInterruptible_await() { testInterruptible(false, AwaitMethod.await); } 935 public void testInterruptible_await_fair() { testInterruptible(true, AwaitMethod.await); } 936 public void testInterruptible_awaitTimed() { testInterruptible(false, AwaitMethod.awaitTimed); } 937 public void testInterruptible_awaitTimed_fair() { testInterruptible(true, AwaitMethod.awaitTimed); } 938 public void testInterruptible_awaitNanos() { testInterruptible(false, AwaitMethod.awaitNanos); } 939 public void testInterruptible_awaitNanos_fair() { testInterruptible(true, AwaitMethod.awaitNanos); } 940 public void testInterruptible_awaitUntil() { testInterruptible(false, AwaitMethod.awaitUntil); } 941 public void testInterruptible_awaitUntil_fair() { testInterruptible(true, AwaitMethod.awaitUntil); } 942 public void testInterruptible(boolean fair, final AwaitMethod awaitMethod) { 943 final PublicReentrantLock lock = 944 new PublicReentrantLock(fair); 945 final Condition c = lock.newCondition(); 946 final CountDownLatch pleaseInterrupt = new CountDownLatch(1); 947 Thread t = newStartedThread(new CheckedInterruptedRunnable() { 948 public void realRun() throws InterruptedException { 949 lock.lock(); 950 assertLockedByMoi(lock); 951 assertHasNoWaiters(lock, c); 952 pleaseInterrupt.countDown(); 953 try { 954 await(c, awaitMethod); 955 } finally { 956 assertLockedByMoi(lock); 957 assertHasNoWaiters(lock, c); 958 lock.unlock(); 959 assertFalse(Thread.interrupted()); 960 } 961 }}); 962 963 await(pleaseInterrupt); 964 assertHasWaiters(lock, c, t); 965 t.interrupt(); 966 awaitTermination(t); 967 assertNotLocked(lock); 968 } 969 970 /** 971 * signalAll wakes up all threads 972 */ 973 public void testSignalAll_await() { testSignalAll(false, AwaitMethod.await); } 974 public void testSignalAll_await_fair() { testSignalAll(true, AwaitMethod.await); } 975 public void testSignalAll_awaitTimed() { testSignalAll(false, AwaitMethod.awaitTimed); } 976 public void testSignalAll_awaitTimed_fair() { testSignalAll(true, AwaitMethod.awaitTimed); } 977 public void testSignalAll_awaitNanos() { testSignalAll(false, AwaitMethod.awaitNanos); } 978 public void testSignalAll_awaitNanos_fair() { testSignalAll(true, AwaitMethod.awaitNanos); } 979 public void testSignalAll_awaitUntil() { testSignalAll(false, AwaitMethod.awaitUntil); } 980 public void testSignalAll_awaitUntil_fair() { testSignalAll(true, AwaitMethod.awaitUntil); } 981 public void testSignalAll(boolean fair, final AwaitMethod awaitMethod) { 982 final PublicReentrantLock lock = new PublicReentrantLock(fair); 983 final Condition c = lock.newCondition(); 984 final CountDownLatch pleaseSignal = new CountDownLatch(2); 985 class Awaiter extends CheckedRunnable { 986 public void realRun() throws InterruptedException { 987 lock.lock(); 988 pleaseSignal.countDown(); 989 await(c, awaitMethod); 990 lock.unlock(); 991 } 992 } 993 994 Thread t1 = newStartedThread(new Awaiter()); 995 Thread t2 = newStartedThread(new Awaiter()); 996 997 await(pleaseSignal); 998 lock.lock(); 999 assertHasWaiters(lock, c, t1, t2); 1000 c.signalAll(); 1001 assertHasNoWaiters(lock, c); 1002 lock.unlock(); 1003 awaitTermination(t1); 1004 awaitTermination(t2); 1005 } 1006 1007 /** 1008 * signal wakes up waiting threads in FIFO order 1009 */ 1010 public void testSignalWakesFifo() { testSignalWakesFifo(false); } 1011 public void testSignalWakesFifo_fair() { testSignalWakesFifo(true); } 1012 public void testSignalWakesFifo(boolean fair) { 1013 final PublicReentrantLock lock = 1014 new PublicReentrantLock(fair); 1015 final Condition c = lock.newCondition(); 1016 final CountDownLatch locked1 = new CountDownLatch(1); 1017 final CountDownLatch locked2 = new CountDownLatch(1); 1018 Thread t1 = newStartedThread(new CheckedRunnable() { 1019 public void realRun() throws InterruptedException { 1020 lock.lock(); 1021 locked1.countDown(); 1022 c.await(); 1023 lock.unlock(); 1024 }}); 1025 1026 await(locked1); 1027 1028 Thread t2 = newStartedThread(new CheckedRunnable() { 1029 public void realRun() throws InterruptedException { 1030 lock.lock(); 1031 locked2.countDown(); 1032 c.await(); 1033 lock.unlock(); 1034 }}); 1035 1036 await(locked2); 1037 1038 lock.lock(); 1039 assertHasWaiters(lock, c, t1, t2); 1040 assertFalse(lock.hasQueuedThreads()); 1041 c.signal(); 1042 assertHasWaiters(lock, c, t2); 1043 assertTrue(lock.hasQueuedThread(t1)); 1044 assertFalse(lock.hasQueuedThread(t2)); 1045 c.signal(); 1046 assertHasNoWaiters(lock, c); 1047 assertTrue(lock.hasQueuedThread(t1)); 1048 assertTrue(lock.hasQueuedThread(t2)); 1049 lock.unlock(); 1050 awaitTermination(t1); 1051 awaitTermination(t2); 1052 } 1053 1054 /** 1055 * await after multiple reentrant locking preserves lock count 1056 */ 1057 public void testAwaitLockCount() { testAwaitLockCount(false); } 1058 public void testAwaitLockCount_fair() { testAwaitLockCount(true); } 1059 public void testAwaitLockCount(boolean fair) { 1060 final PublicReentrantLock lock = new PublicReentrantLock(fair); 1061 final Condition c = lock.newCondition(); 1062 final CountDownLatch pleaseSignal = new CountDownLatch(2); 1063 Thread t1 = newStartedThread(new CheckedRunnable() { 1064 public void realRun() throws InterruptedException { 1065 lock.lock(); 1066 assertLockedByMoi(lock); 1067 assertEquals(1, lock.getHoldCount()); 1068 pleaseSignal.countDown(); 1069 c.await(); 1070 assertLockedByMoi(lock); 1071 assertEquals(1, lock.getHoldCount()); 1072 lock.unlock(); 1073 }}); 1074 1075 Thread t2 = newStartedThread(new CheckedRunnable() { 1076 public void realRun() throws InterruptedException { 1077 lock.lock(); 1078 lock.lock(); 1079 assertLockedByMoi(lock); 1080 assertEquals(2, lock.getHoldCount()); 1081 pleaseSignal.countDown(); 1082 c.await(); 1083 assertLockedByMoi(lock); 1084 assertEquals(2, lock.getHoldCount()); 1085 lock.unlock(); 1086 lock.unlock(); 1087 }}); 1088 1089 await(pleaseSignal); 1090 lock.lock(); 1091 assertHasWaiters(lock, c, t1, t2); 1092 assertEquals(1, lock.getHoldCount()); 1093 c.signalAll(); 1094 assertHasNoWaiters(lock, c); 1095 lock.unlock(); 1096 awaitTermination(t1); 1097 awaitTermination(t2); 1098 } 1099 1100 /** 1101 * A serialized lock deserializes as unlocked 1102 */ 1103 public void testSerialization() { testSerialization(false); } 1104 public void testSerialization_fair() { testSerialization(true); } 1105 public void testSerialization(boolean fair) { 1106 ReentrantLock lock = new ReentrantLock(fair); 1107 lock.lock(); 1108 1109 ReentrantLock clone = serialClone(lock); 1110 assertEquals(lock.isFair(), clone.isFair()); 1111 assertTrue(lock.isLocked()); 1112 assertFalse(clone.isLocked()); 1113 assertEquals(1, lock.getHoldCount()); 1114 assertEquals(0, clone.getHoldCount()); 1115 clone.lock(); 1116 clone.lock(); 1117 assertTrue(clone.isLocked()); 1118 assertEquals(2, clone.getHoldCount()); 1119 assertEquals(1, lock.getHoldCount()); 1120 clone.unlock(); 1121 clone.unlock(); 1122 assertTrue(lock.isLocked()); 1123 assertFalse(clone.isLocked()); 1124 } 1125 1126 /** 1127 * toString indicates current lock state 1128 */ 1129 public void testToString() { testToString(false); } 1130 public void testToString_fair() { testToString(true); } 1131 public void testToString(boolean fair) { 1132 ReentrantLock lock = new ReentrantLock(fair); 1133 assertTrue(lock.toString().contains("Unlocked")); 1134 lock.lock(); 1135 assertTrue(lock.toString().contains("Locked")); 1136 lock.unlock(); 1137 assertTrue(lock.toString().contains("Unlocked")); 1138 } 1139 } 1140