ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.51
Committed: Fri Jun 3 05:07:14 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.50: +40 -23 lines
Log Message:
improve "uninterruptible" tests

File Contents

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