ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.50
Committed: Tue May 31 16:16:24 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.49: +4 -3 lines
Log Message:
use serialClone in serialization tests; update imports

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 locked = 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 locked.countDown();
746 c.await();
747 assertHasNoWaiters(lock, c);
748 assertFalse(lock.hasWaiters(c));
749 lock.unlock();
750 }});
751
752 await(locked);
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 doesn't abort on interrupt
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 locked = new CountDownLatch(1);
891 Thread t = newStartedThread(new CheckedRunnable() {
892 public void realRun() {
893 lock.lock();
894 locked.countDown();
895 c.awaitUninterruptibly();
896 assertTrue(Thread.interrupted());
897 lock.unlock();
898 }});
899
900 await(locked);
901 lock.lock();
902 lock.unlock();
903 t.interrupt();
904 long timeoutMillis = 10;
905 assertThreadStaysAlive(t, timeoutMillis);
906 lock.lock();
907 c.signal();
908 lock.unlock();
909 awaitTermination(t);
910 }
911
912 /**
913 * await/awaitNanos/awaitUntil is interruptible
914 */
915 public void testInterruptible_await() { testInterruptible(false, AwaitMethod.await); }
916 public void testInterruptible_await_fair() { testInterruptible(true, AwaitMethod.await); }
917 public void testInterruptible_awaitTimed() { testInterruptible(false, AwaitMethod.awaitTimed); }
918 public void testInterruptible_awaitTimed_fair() { testInterruptible(true, AwaitMethod.awaitTimed); }
919 public void testInterruptible_awaitNanos() { testInterruptible(false, AwaitMethod.awaitNanos); }
920 public void testInterruptible_awaitNanos_fair() { testInterruptible(true, AwaitMethod.awaitNanos); }
921 public void testInterruptible_awaitUntil() { testInterruptible(false, AwaitMethod.awaitUntil); }
922 public void testInterruptible_awaitUntil_fair() { testInterruptible(true, AwaitMethod.awaitUntil); }
923 public void testInterruptible(boolean fair, final AwaitMethod awaitMethod) {
924 final PublicReentrantLock lock =
925 new PublicReentrantLock(fair);
926 final Condition c = lock.newCondition();
927 final CountDownLatch locked = new CountDownLatch(1);
928 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
929 public void realRun() throws InterruptedException {
930 lock.lock();
931 assertLockedByMoi(lock);
932 assertHasNoWaiters(lock, c);
933 locked.countDown();
934 try {
935 await(c, awaitMethod);
936 } finally {
937 assertLockedByMoi(lock);
938 assertHasNoWaiters(lock, c);
939 lock.unlock();
940 assertFalse(Thread.interrupted());
941 }
942 }});
943
944 await(locked);
945 assertHasWaiters(lock, c, t);
946 t.interrupt();
947 awaitTermination(t);
948 assertNotLocked(lock);
949 }
950
951 /**
952 * signalAll wakes up all threads
953 */
954 public void testSignalAll_await() { testSignalAll(false, AwaitMethod.await); }
955 public void testSignalAll_await_fair() { testSignalAll(true, AwaitMethod.await); }
956 public void testSignalAll_awaitTimed() { testSignalAll(false, AwaitMethod.awaitTimed); }
957 public void testSignalAll_awaitTimed_fair() { testSignalAll(true, AwaitMethod.awaitTimed); }
958 public void testSignalAll_awaitNanos() { testSignalAll(false, AwaitMethod.awaitNanos); }
959 public void testSignalAll_awaitNanos_fair() { testSignalAll(true, AwaitMethod.awaitNanos); }
960 public void testSignalAll_awaitUntil() { testSignalAll(false, AwaitMethod.awaitUntil); }
961 public void testSignalAll_awaitUntil_fair() { testSignalAll(true, AwaitMethod.awaitUntil); }
962 public void testSignalAll(boolean fair, final AwaitMethod awaitMethod) {
963 final PublicReentrantLock lock = new PublicReentrantLock(fair);
964 final Condition c = lock.newCondition();
965 final CountDownLatch locked = new CountDownLatch(2);
966 class Awaiter extends CheckedRunnable {
967 public void realRun() throws InterruptedException {
968 lock.lock();
969 locked.countDown();
970 await(c, awaitMethod);
971 lock.unlock();
972 }
973 }
974
975 Thread t1 = newStartedThread(new Awaiter());
976 Thread t2 = newStartedThread(new Awaiter());
977
978 await(locked);
979 lock.lock();
980 assertHasWaiters(lock, c, t1, t2);
981 c.signalAll();
982 assertHasNoWaiters(lock, c);
983 lock.unlock();
984 awaitTermination(t1);
985 awaitTermination(t2);
986 }
987
988 /**
989 * signal wakes up waiting threads in FIFO order
990 */
991 public void testSignalWakesFifo() { testSignalWakesFifo(false); }
992 public void testSignalWakesFifo_fair() { testSignalWakesFifo(true); }
993 public void testSignalWakesFifo(boolean fair) {
994 final PublicReentrantLock lock =
995 new PublicReentrantLock(fair);
996 final Condition c = lock.newCondition();
997 final CountDownLatch locked1 = new CountDownLatch(1);
998 final CountDownLatch locked2 = new CountDownLatch(1);
999 Thread t1 = newStartedThread(new CheckedRunnable() {
1000 public void realRun() throws InterruptedException {
1001 lock.lock();
1002 locked1.countDown();
1003 c.await();
1004 lock.unlock();
1005 }});
1006
1007 await(locked1);
1008
1009 Thread t2 = newStartedThread(new CheckedRunnable() {
1010 public void realRun() throws InterruptedException {
1011 lock.lock();
1012 locked2.countDown();
1013 c.await();
1014 lock.unlock();
1015 }});
1016
1017 await(locked2);
1018
1019 lock.lock();
1020 assertHasWaiters(lock, c, t1, t2);
1021 assertFalse(lock.hasQueuedThreads());
1022 c.signal();
1023 assertHasWaiters(lock, c, t2);
1024 assertTrue(lock.hasQueuedThread(t1));
1025 assertFalse(lock.hasQueuedThread(t2));
1026 c.signal();
1027 assertHasNoWaiters(lock, c);
1028 assertTrue(lock.hasQueuedThread(t1));
1029 assertTrue(lock.hasQueuedThread(t2));
1030 lock.unlock();
1031 awaitTermination(t1);
1032 awaitTermination(t2);
1033 }
1034
1035 /**
1036 * await after multiple reentrant locking preserves lock count
1037 */
1038 public void testAwaitLockCount() { testAwaitLockCount(false); }
1039 public void testAwaitLockCount_fair() { testAwaitLockCount(true); }
1040 public void testAwaitLockCount(boolean fair) {
1041 final PublicReentrantLock lock = new PublicReentrantLock(fair);
1042 final Condition c = lock.newCondition();
1043 final CountDownLatch locked = new CountDownLatch(2);
1044 Thread t1 = newStartedThread(new CheckedRunnable() {
1045 public void realRun() throws InterruptedException {
1046 lock.lock();
1047 assertLockedByMoi(lock);
1048 assertEquals(1, lock.getHoldCount());
1049 locked.countDown();
1050 c.await();
1051 assertLockedByMoi(lock);
1052 assertEquals(1, lock.getHoldCount());
1053 lock.unlock();
1054 }});
1055
1056 Thread t2 = newStartedThread(new CheckedRunnable() {
1057 public void realRun() throws InterruptedException {
1058 lock.lock();
1059 lock.lock();
1060 assertLockedByMoi(lock);
1061 assertEquals(2, lock.getHoldCount());
1062 locked.countDown();
1063 c.await();
1064 assertLockedByMoi(lock);
1065 assertEquals(2, lock.getHoldCount());
1066 lock.unlock();
1067 lock.unlock();
1068 }});
1069
1070 await(locked);
1071 lock.lock();
1072 assertHasWaiters(lock, c, t1, t2);
1073 assertEquals(1, lock.getHoldCount());
1074 c.signalAll();
1075 assertHasNoWaiters(lock, c);
1076 lock.unlock();
1077 awaitTermination(t1);
1078 awaitTermination(t2);
1079 }
1080
1081 /**
1082 * A serialized lock deserializes as unlocked
1083 */
1084 public void testSerialization() { testSerialization(false); }
1085 public void testSerialization_fair() { testSerialization(true); }
1086 public void testSerialization(boolean fair) {
1087 ReentrantLock lock = new ReentrantLock(fair);
1088 lock.lock();
1089
1090 ReentrantLock clone = serialClone(lock);
1091 assertEquals(lock.isFair(), clone.isFair());
1092 assertTrue(lock.isLocked());
1093 assertFalse(clone.isLocked());
1094 assertEquals(1, lock.getHoldCount());
1095 assertEquals(0, clone.getHoldCount());
1096 clone.lock();
1097 clone.lock();
1098 assertTrue(clone.isLocked());
1099 assertEquals(2, clone.getHoldCount());
1100 assertEquals(1, lock.getHoldCount());
1101 clone.unlock();
1102 clone.unlock();
1103 assertTrue(lock.isLocked());
1104 assertFalse(clone.isLocked());
1105 }
1106
1107 /**
1108 * toString indicates current lock state
1109 */
1110 public void testToString() { testToString(false); }
1111 public void testToString_fair() { testToString(true); }
1112 public void testToString(boolean fair) {
1113 ReentrantLock lock = new ReentrantLock(fair);
1114 assertTrue(lock.toString().contains("Unlocked"));
1115 lock.lock();
1116 assertTrue(lock.toString().contains("Locked"));
1117 lock.unlock();
1118 assertTrue(lock.toString().contains("Unlocked"));
1119 }
1120 }