ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.42
Committed: Sat May 7 03:12:48 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.41: +29 -42 lines
Log Message:
use awaitTermination

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.*;
11 import java.util.concurrent.*;
12 import static java.util.concurrent.TimeUnit.MILLISECONDS;
13 import java.util.*;
14 import java.io.*;
15
16 public class ReentrantLockTest extends JSR166TestCase {
17 public static void main(String[] args) {
18 junit.textui.TestRunner.run(suite());
19 }
20 public static Test suite() {
21 return new TestSuite(ReentrantLockTest.class);
22 }
23
24 /**
25 * A runnable calling lockInterruptibly
26 */
27 class InterruptibleLockRunnable extends CheckedRunnable {
28 final ReentrantLock lock;
29 InterruptibleLockRunnable(ReentrantLock l) { lock = l; }
30 public void realRun() throws InterruptedException {
31 lock.lockInterruptibly();
32 }
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 public Collection<Thread> getQueuedThreads() {
54 return super.getQueuedThreads();
55 }
56 public Collection<Thread> getWaitingThreads(Condition c) {
57 return super.getWaitingThreads(c);
58 }
59 }
60
61 /**
62 * Constructor sets given fairness
63 */
64 public void testConstructor() {
65 assertFalse(new ReentrantLock().isFair());
66 assertFalse(new ReentrantLock(false).isFair());
67 assertTrue(new ReentrantLock(true).isFair());
68 }
69
70 /**
71 * locking an unlocked lock succeeds
72 */
73 public void testLock() {
74 ReentrantLock rl = new ReentrantLock();
75 rl.lock();
76 assertTrue(rl.isLocked());
77 rl.unlock();
78 assertFalse(rl.isLocked());
79 }
80
81 /**
82 * locking an unlocked fair lock succeeds
83 */
84 public void testFairLock() {
85 ReentrantLock rl = new ReentrantLock(true);
86 rl.lock();
87 assertTrue(rl.isLocked());
88 rl.unlock();
89 }
90
91 /**
92 * Unlocking an unlocked lock throws IllegalMonitorStateException
93 */
94 public void testUnlock_IllegalMonitorStateException() {
95 ReentrantLock rl = new ReentrantLock();
96 try {
97 rl.unlock();
98 shouldThrow();
99 } catch (IllegalMonitorStateException success) {}
100 }
101
102 /**
103 * tryLock on an unlocked lock succeeds
104 */
105 public void testTryLock() {
106 ReentrantLock rl = new ReentrantLock();
107 assertTrue(rl.tryLock());
108 assertTrue(rl.isLocked());
109 rl.unlock();
110 }
111
112
113 /**
114 * hasQueuedThreads reports whether there are waiting threads
115 */
116 public void testhasQueuedThreads() throws InterruptedException {
117 final ReentrantLock lock = new ReentrantLock();
118 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
119 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
120 assertFalse(lock.hasQueuedThreads());
121 lock.lock();
122 t1.start();
123 delay(SHORT_DELAY_MS);
124 assertTrue(lock.hasQueuedThreads());
125 t2.start();
126 delay(SHORT_DELAY_MS);
127 assertTrue(lock.hasQueuedThreads());
128 t1.interrupt();
129 delay(SHORT_DELAY_MS);
130 assertTrue(lock.hasQueuedThreads());
131 lock.unlock();
132 delay(SHORT_DELAY_MS);
133 assertFalse(lock.hasQueuedThreads());
134 awaitTermination(t1);
135 awaitTermination(t2);
136 }
137
138 /**
139 * getQueueLength reports number of waiting threads
140 */
141 public void testGetQueueLength() throws InterruptedException {
142 final ReentrantLock lock = new ReentrantLock();
143 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
144 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
145 assertEquals(0, lock.getQueueLength());
146 lock.lock();
147 t1.start();
148 delay(SHORT_DELAY_MS);
149 assertEquals(1, lock.getQueueLength());
150 t2.start();
151 delay(SHORT_DELAY_MS);
152 assertEquals(2, lock.getQueueLength());
153 t1.interrupt();
154 delay(SHORT_DELAY_MS);
155 assertEquals(1, lock.getQueueLength());
156 lock.unlock();
157 delay(SHORT_DELAY_MS);
158 assertEquals(0, lock.getQueueLength());
159 awaitTermination(t1);
160 awaitTermination(t2);
161 }
162
163 /**
164 * getQueueLength reports number of waiting threads
165 */
166 public void testGetQueueLength_fair() throws InterruptedException {
167 final ReentrantLock lock = new ReentrantLock(true);
168 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
169 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
170 assertEquals(0, lock.getQueueLength());
171 lock.lock();
172 t1.start();
173 delay(SHORT_DELAY_MS);
174 assertEquals(1, lock.getQueueLength());
175 t2.start();
176 delay(SHORT_DELAY_MS);
177 assertEquals(2, lock.getQueueLength());
178 t1.interrupt();
179 delay(SHORT_DELAY_MS);
180 assertEquals(1, lock.getQueueLength());
181 lock.unlock();
182 delay(SHORT_DELAY_MS);
183 assertEquals(0, lock.getQueueLength());
184 awaitTermination(t1);
185 awaitTermination(t2);
186 }
187
188 /**
189 * hasQueuedThread(null) throws NPE
190 */
191 public void testHasQueuedThreadNPE() {
192 final ReentrantLock sync = new ReentrantLock();
193 try {
194 sync.hasQueuedThread(null);
195 shouldThrow();
196 } catch (NullPointerException success) {}
197 }
198
199 /**
200 * hasQueuedThread reports whether a thread is queued.
201 */
202 public void testHasQueuedThread() throws InterruptedException {
203 final ReentrantLock sync = new ReentrantLock();
204 Thread t1 = new Thread(new InterruptedLockRunnable(sync));
205 Thread t2 = new Thread(new InterruptibleLockRunnable(sync));
206 assertFalse(sync.hasQueuedThread(t1));
207 assertFalse(sync.hasQueuedThread(t2));
208 sync.lock();
209 t1.start();
210 delay(SHORT_DELAY_MS);
211 assertTrue(sync.hasQueuedThread(t1));
212 t2.start();
213 delay(SHORT_DELAY_MS);
214 assertTrue(sync.hasQueuedThread(t1));
215 assertTrue(sync.hasQueuedThread(t2));
216 t1.interrupt();
217 delay(SHORT_DELAY_MS);
218 assertFalse(sync.hasQueuedThread(t1));
219 assertTrue(sync.hasQueuedThread(t2));
220 sync.unlock();
221 delay(SHORT_DELAY_MS);
222 assertFalse(sync.hasQueuedThread(t1));
223 delay(SHORT_DELAY_MS);
224 assertFalse(sync.hasQueuedThread(t2));
225 awaitTermination(t1);
226 awaitTermination(t2);
227 }
228
229
230 /**
231 * getQueuedThreads includes waiting threads
232 */
233 public void testGetQueuedThreads() throws InterruptedException {
234 final PublicReentrantLock lock = new PublicReentrantLock();
235 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
236 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
237 assertTrue(lock.getQueuedThreads().isEmpty());
238 lock.lock();
239 assertTrue(lock.getQueuedThreads().isEmpty());
240 t1.start();
241 delay(SHORT_DELAY_MS);
242 assertTrue(lock.getQueuedThreads().contains(t1));
243 t2.start();
244 delay(SHORT_DELAY_MS);
245 assertTrue(lock.getQueuedThreads().contains(t1));
246 assertTrue(lock.getQueuedThreads().contains(t2));
247 t1.interrupt();
248 delay(SHORT_DELAY_MS);
249 assertFalse(lock.getQueuedThreads().contains(t1));
250 assertTrue(lock.getQueuedThreads().contains(t2));
251 lock.unlock();
252 delay(SHORT_DELAY_MS);
253 assertTrue(lock.getQueuedThreads().isEmpty());
254 awaitTermination(t1);
255 awaitTermination(t2);
256 }
257
258
259 /**
260 * timed tryLock is interruptible.
261 */
262 public void testInterruptedException2() throws InterruptedException {
263 final ReentrantLock lock = new ReentrantLock();
264 lock.lock();
265 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
266 public void realRun() throws InterruptedException {
267 lock.tryLock(MEDIUM_DELAY_MS,MILLISECONDS);
268 }});
269
270 delay(SHORT_DELAY_MS);
271 t.interrupt();
272 awaitTermination(t);
273 }
274
275
276 /**
277 * TryLock on a locked lock fails
278 */
279 public void testTryLockWhenLocked() throws InterruptedException {
280 final ReentrantLock lock = new ReentrantLock();
281 lock.lock();
282 Thread t = newStartedThread(new CheckedRunnable() {
283 public void realRun() {
284 assertFalse(lock.tryLock());
285 }});
286
287 awaitTermination(t);
288 lock.unlock();
289 }
290
291 /**
292 * Timed tryLock on a locked lock times out
293 */
294 public void testTryLock_Timeout() throws InterruptedException {
295 final ReentrantLock lock = new ReentrantLock();
296 lock.lock();
297 Thread t = newStartedThread(new CheckedRunnable() {
298 public void realRun() throws InterruptedException {
299 assertFalse(lock.tryLock(1, MILLISECONDS));
300 }});
301
302 awaitTermination(t);
303 lock.unlock();
304 }
305
306 /**
307 * getHoldCount returns number of recursive holds
308 */
309 public void testGetHoldCount() {
310 ReentrantLock lock = new ReentrantLock();
311 for (int i = 1; i <= SIZE; i++) {
312 lock.lock();
313 assertEquals(i, lock.getHoldCount());
314 }
315 for (int i = SIZE; i > 0; i--) {
316 lock.unlock();
317 assertEquals(i-1, lock.getHoldCount());
318 }
319 }
320
321
322 /**
323 * isLocked is true when locked and false when not
324 */
325 public void testIsLocked() throws InterruptedException {
326 final ReentrantLock lock = new ReentrantLock();
327 lock.lock();
328 assertTrue(lock.isLocked());
329 lock.unlock();
330 assertFalse(lock.isLocked());
331 Thread t = newStartedThread(new CheckedRunnable() {
332 public void realRun() throws InterruptedException {
333 lock.lock();
334 delay(SMALL_DELAY_MS);
335 lock.unlock();
336 }});
337
338 delay(SHORT_DELAY_MS);
339 assertTrue(lock.isLocked());
340 awaitTermination(t);
341 assertFalse(lock.isLocked());
342 }
343
344
345 /**
346 * lockInterruptibly is interruptible.
347 */
348 public void testLockInterruptibly1() throws InterruptedException {
349 final ReentrantLock lock = new ReentrantLock();
350 lock.lock();
351 Thread t = newStartedThread(new InterruptedLockRunnable(lock));
352 delay(SHORT_DELAY_MS);
353 t.interrupt();
354 delay(SHORT_DELAY_MS);
355 lock.unlock();
356 awaitTermination(t);
357 }
358
359 /**
360 * lockInterruptibly succeeds when unlocked, else is interruptible
361 */
362 public void testLockInterruptibly2() throws InterruptedException {
363 final ReentrantLock lock = new ReentrantLock();
364 lock.lockInterruptibly();
365 Thread t = newStartedThread(new InterruptedLockRunnable(lock));
366 delay(SHORT_DELAY_MS);
367 t.interrupt();
368 assertTrue(lock.isLocked());
369 assertTrue(lock.isHeldByCurrentThread());
370 awaitTermination(t);
371 }
372
373 /**
374 * Calling await without holding lock throws IllegalMonitorStateException
375 */
376 public void testAwait_IllegalMonitor() throws InterruptedException {
377 final ReentrantLock lock = new ReentrantLock();
378 final Condition c = lock.newCondition();
379 try {
380 c.await();
381 shouldThrow();
382 } catch (IllegalMonitorStateException success) {}
383 }
384
385 /**
386 * Calling signal without holding lock throws IllegalMonitorStateException
387 */
388 public void testSignal_IllegalMonitor() {
389 final ReentrantLock lock = new ReentrantLock();
390 final Condition c = lock.newCondition();
391 try {
392 c.signal();
393 shouldThrow();
394 } catch (IllegalMonitorStateException success) {}
395 }
396
397 /**
398 * awaitNanos without a signal times out
399 */
400 public void testAwaitNanos_Timeout() throws InterruptedException {
401 final ReentrantLock lock = new ReentrantLock();
402 final Condition c = lock.newCondition();
403 lock.lock();
404 long t = c.awaitNanos(100);
405 assertTrue(t <= 0);
406 lock.unlock();
407 }
408
409 /**
410 * timed await without a signal times out
411 */
412 public void testAwait_Timeout() throws InterruptedException {
413 final ReentrantLock lock = new ReentrantLock();
414 final Condition c = lock.newCondition();
415 lock.lock();
416 assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
417 lock.unlock();
418 }
419
420 /**
421 * awaitUntil without a signal times out
422 */
423 public void testAwaitUntil_Timeout() throws InterruptedException {
424 final ReentrantLock lock = new ReentrantLock();
425 final Condition c = lock.newCondition();
426 lock.lock();
427 java.util.Date d = new java.util.Date();
428 assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
429 lock.unlock();
430 }
431
432 /**
433 * await returns when signalled
434 */
435 public void testAwait() throws InterruptedException {
436 final ReentrantLock lock = new ReentrantLock();
437 final Condition c = lock.newCondition();
438 Thread t = newStartedThread(new CheckedRunnable() {
439 public void realRun() throws InterruptedException {
440 lock.lock();
441 c.await();
442 lock.unlock();
443 }});
444
445 delay(SHORT_DELAY_MS);
446 lock.lock();
447 c.signal();
448 lock.unlock();
449 awaitTermination(t);
450 }
451
452 /**
453 * hasWaiters throws NPE if null
454 */
455 public void testHasWaitersNPE() {
456 final ReentrantLock lock = new ReentrantLock();
457 try {
458 lock.hasWaiters(null);
459 shouldThrow();
460 } catch (NullPointerException success) {}
461 }
462
463 /**
464 * getWaitQueueLength throws NPE if null
465 */
466 public void testGetWaitQueueLengthNPE() {
467 final ReentrantLock lock = new ReentrantLock();
468 try {
469 lock.getWaitQueueLength(null);
470 shouldThrow();
471 } catch (NullPointerException success) {}
472 }
473
474
475 /**
476 * getWaitingThreads throws NPE if null
477 */
478 public void testGetWaitingThreadsNPE() {
479 final PublicReentrantLock lock = new PublicReentrantLock();
480 try {
481 lock.getWaitingThreads(null);
482 shouldThrow();
483 } catch (NullPointerException success) {}
484 }
485
486
487 /**
488 * hasWaiters throws IAE if not owned
489 */
490 public void testHasWaitersIAE() {
491 final ReentrantLock lock = new ReentrantLock();
492 final Condition c = lock.newCondition();
493 final ReentrantLock lock2 = new ReentrantLock();
494 try {
495 lock2.hasWaiters(c);
496 shouldThrow();
497 } catch (IllegalArgumentException success) {}
498 }
499
500 /**
501 * hasWaiters throws IMSE if not locked
502 */
503 public void testHasWaitersIMSE() {
504 final ReentrantLock lock = new ReentrantLock();
505 final Condition c = lock.newCondition();
506 try {
507 lock.hasWaiters(c);
508 shouldThrow();
509 } catch (IllegalMonitorStateException success) {}
510 }
511
512
513 /**
514 * getWaitQueueLength throws IAE if not owned
515 */
516 public void testGetWaitQueueLengthIAE() {
517 final ReentrantLock lock = new ReentrantLock();
518 final Condition c = lock.newCondition();
519 final ReentrantLock lock2 = new ReentrantLock();
520 try {
521 lock2.getWaitQueueLength(c);
522 shouldThrow();
523 } catch (IllegalArgumentException success) {}
524 }
525
526 /**
527 * getWaitQueueLength throws IMSE if not locked
528 */
529 public void testGetWaitQueueLengthIMSE() {
530 final ReentrantLock lock = new ReentrantLock();
531 final Condition c = lock.newCondition();
532 try {
533 lock.getWaitQueueLength(c);
534 shouldThrow();
535 } catch (IllegalMonitorStateException success) {}
536 }
537
538
539 /**
540 * getWaitingThreads throws IAE if not owned
541 */
542 public void testGetWaitingThreadsIAE() {
543 final PublicReentrantLock lock = new PublicReentrantLock();
544 final Condition c = lock.newCondition();
545 final PublicReentrantLock lock2 = new PublicReentrantLock();
546 try {
547 lock2.getWaitingThreads(c);
548 shouldThrow();
549 } catch (IllegalArgumentException success) {}
550 }
551
552 /**
553 * getWaitingThreads throws IMSE if not locked
554 */
555 public void testGetWaitingThreadsIMSE() {
556 final PublicReentrantLock lock = new PublicReentrantLock();
557 final Condition c = lock.newCondition();
558 try {
559 lock.getWaitingThreads(c);
560 shouldThrow();
561 } catch (IllegalMonitorStateException success) {}
562 }
563
564
565 /**
566 * hasWaiters returns true when a thread is waiting, else false
567 */
568 public void testHasWaiters() throws InterruptedException {
569 final ReentrantLock lock = new ReentrantLock();
570 final Condition c = lock.newCondition();
571 Thread t = newStartedThread(new CheckedRunnable() {
572 public void realRun() throws InterruptedException {
573 lock.lock();
574 assertFalse(lock.hasWaiters(c));
575 assertEquals(0, lock.getWaitQueueLength(c));
576 c.await();
577 lock.unlock();
578 }});
579
580 delay(SHORT_DELAY_MS);
581 lock.lock();
582 assertTrue(lock.hasWaiters(c));
583 assertEquals(1, lock.getWaitQueueLength(c));
584 c.signal();
585 lock.unlock();
586 delay(SHORT_DELAY_MS);
587 lock.lock();
588 assertFalse(lock.hasWaiters(c));
589 assertEquals(0, lock.getWaitQueueLength(c));
590 lock.unlock();
591 awaitTermination(t);
592 }
593
594 /**
595 * getWaitQueueLength returns number of waiting threads
596 */
597 public void testGetWaitQueueLength() throws InterruptedException {
598 final ReentrantLock lock = new ReentrantLock();
599 final Condition c = lock.newCondition();
600 Thread t1 = newStartedThread(new CheckedRunnable() {
601 public void realRun() throws InterruptedException {
602 lock.lock();
603 assertFalse(lock.hasWaiters(c));
604 assertEquals(0, lock.getWaitQueueLength(c));
605 c.await();
606 lock.unlock();
607 }});
608
609 delay(SHORT_DELAY_MS);
610
611 Thread t2 = newStartedThread(new CheckedRunnable() {
612 public void realRun() throws InterruptedException {
613 lock.lock();
614 assertTrue(lock.hasWaiters(c));
615 assertEquals(1, lock.getWaitQueueLength(c));
616 c.await();
617 lock.unlock();
618 }});
619
620 delay(SHORT_DELAY_MS);
621 lock.lock();
622 assertTrue(lock.hasWaiters(c));
623 assertEquals(2, lock.getWaitQueueLength(c));
624 c.signalAll();
625 lock.unlock();
626 delay(SHORT_DELAY_MS);
627 lock.lock();
628 assertFalse(lock.hasWaiters(c));
629 assertEquals(0, lock.getWaitQueueLength(c));
630 lock.unlock();
631 awaitTermination(t1);
632 awaitTermination(t2);
633 }
634
635 /**
636 * getWaitingThreads returns only and all waiting threads
637 */
638 public void testGetWaitingThreads() throws InterruptedException {
639 final PublicReentrantLock lock = new PublicReentrantLock();
640 final Condition c = lock.newCondition();
641 Thread t1 = new Thread(new CheckedRunnable() {
642 public void realRun() throws InterruptedException {
643 lock.lock();
644 assertTrue(lock.getWaitingThreads(c).isEmpty());
645 c.await();
646 lock.unlock();
647 }});
648
649 Thread t2 = new Thread(new CheckedRunnable() {
650 public void realRun() throws InterruptedException {
651 lock.lock();
652 assertFalse(lock.getWaitingThreads(c).isEmpty());
653 c.await();
654 lock.unlock();
655 }});
656
657 lock.lock();
658 assertTrue(lock.getWaitingThreads(c).isEmpty());
659 lock.unlock();
660 t1.start();
661 delay(SHORT_DELAY_MS);
662 t2.start();
663 delay(SHORT_DELAY_MS);
664 lock.lock();
665 assertTrue(lock.hasWaiters(c));
666 assertTrue(lock.getWaitingThreads(c).contains(t1));
667 assertTrue(lock.getWaitingThreads(c).contains(t2));
668 c.signalAll();
669 lock.unlock();
670 delay(SHORT_DELAY_MS);
671 lock.lock();
672 assertFalse(lock.hasWaiters(c));
673 assertTrue(lock.getWaitingThreads(c).isEmpty());
674 lock.unlock();
675 awaitTermination(t1);
676 awaitTermination(t2);
677 }
678
679 /** A helper class for uninterruptible wait tests */
680 class UninterruptibleThread extends Thread {
681 private ReentrantLock lock;
682 private Condition c;
683
684 public volatile boolean canAwake = false;
685 public volatile boolean interrupted = false;
686 public volatile boolean lockStarted = false;
687
688 public UninterruptibleThread(ReentrantLock lock, Condition c) {
689 this.lock = lock;
690 this.c = c;
691 }
692
693 public synchronized void run() {
694 lock.lock();
695 lockStarted = true;
696
697 while (!canAwake) {
698 c.awaitUninterruptibly();
699 }
700
701 interrupted = isInterrupted();
702 lock.unlock();
703 }
704 }
705
706 /**
707 * awaitUninterruptibly doesn't abort on interrupt
708 */
709 public void testAwaitUninterruptibly() throws InterruptedException {
710 final ReentrantLock lock = new ReentrantLock();
711 final Condition c = lock.newCondition();
712 UninterruptibleThread thread = new UninterruptibleThread(lock, c);
713
714 thread.start();
715
716 while (!thread.lockStarted) {
717 delay(100);
718 }
719
720 lock.lock();
721 try {
722 thread.interrupt();
723 thread.canAwake = true;
724 c.signal();
725 } finally {
726 lock.unlock();
727 }
728
729 thread.join();
730 assertTrue(thread.interrupted);
731 assertFalse(thread.isAlive());
732 }
733
734 /**
735 * await is interruptible
736 */
737 public void testAwait_Interrupt() throws InterruptedException {
738 final ReentrantLock lock = new ReentrantLock();
739 final Condition c = lock.newCondition();
740 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
741 public void realRun() throws InterruptedException {
742 lock.lock();
743 c.await();
744 }});
745
746 delay(SHORT_DELAY_MS);
747 t.interrupt();
748 awaitTermination(t);
749 }
750
751 /**
752 * awaitNanos is interruptible
753 */
754 public void testAwaitNanos_Interrupt() throws InterruptedException {
755 final ReentrantLock lock = new ReentrantLock();
756 final Condition c = lock.newCondition();
757 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
758 public void realRun() throws InterruptedException {
759 lock.lock();
760 c.awaitNanos(MILLISECONDS.toNanos(LONG_DELAY_MS));
761 }});
762
763 delay(SHORT_DELAY_MS);
764 t.interrupt();
765 awaitTermination(t);
766 }
767
768 /**
769 * awaitUntil is interruptible
770 */
771 public void testAwaitUntil_Interrupt() throws InterruptedException {
772 final ReentrantLock lock = new ReentrantLock();
773 final Condition c = lock.newCondition();
774 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
775 public void realRun() throws InterruptedException {
776 lock.lock();
777 java.util.Date d = new java.util.Date();
778 c.awaitUntil(new java.util.Date(d.getTime() + 10000));
779 }});
780
781 delay(SHORT_DELAY_MS);
782 t.interrupt();
783 awaitTermination(t);
784 }
785
786 /**
787 * signalAll wakes up all threads
788 */
789 public void testSignalAll() throws InterruptedException {
790 final ReentrantLock lock = new ReentrantLock();
791 final Condition c = lock.newCondition();
792 Thread t1 = newStartedThread(new CheckedRunnable() {
793 public void realRun() throws InterruptedException {
794 lock.lock();
795 c.await();
796 lock.unlock();
797 }});
798
799 Thread t2 = newStartedThread(new CheckedRunnable() {
800 public void realRun() throws InterruptedException {
801 lock.lock();
802 c.await();
803 lock.unlock();
804 }});
805
806 delay(SHORT_DELAY_MS);
807 lock.lock();
808 c.signalAll();
809 lock.unlock();
810 awaitTermination(t1);
811 awaitTermination(t2);
812 }
813
814 /**
815 * await after multiple reentrant locking preserves lock count
816 */
817 public void testAwaitLockCount() throws InterruptedException {
818 final ReentrantLock lock = new ReentrantLock();
819 final Condition c = lock.newCondition();
820 Thread t1 = newStartedThread(new CheckedRunnable() {
821 public void realRun() throws InterruptedException {
822 lock.lock();
823 assertEquals(1, lock.getHoldCount());
824 c.await();
825 assertEquals(1, lock.getHoldCount());
826 lock.unlock();
827 }});
828
829 Thread t2 = newStartedThread(new CheckedRunnable() {
830 public void realRun() throws InterruptedException {
831 lock.lock();
832 lock.lock();
833 assertEquals(2, lock.getHoldCount());
834 c.await();
835 assertEquals(2, lock.getHoldCount());
836 lock.unlock();
837 lock.unlock();
838 }});
839
840 delay(SHORT_DELAY_MS);
841 lock.lock();
842 c.signalAll();
843 lock.unlock();
844 awaitTermination(t1);
845 awaitTermination(t2);
846 }
847
848 /**
849 * A serialized lock deserializes as unlocked
850 */
851 public void testSerialization() throws Exception {
852 ReentrantLock l = new ReentrantLock();
853 l.lock();
854 l.unlock();
855
856 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
857 ObjectOutputStream out =
858 new ObjectOutputStream(new BufferedOutputStream(bout));
859 out.writeObject(l);
860 out.close();
861
862 ByteArrayInputStream bin =
863 new ByteArrayInputStream(bout.toByteArray());
864 ObjectInputStream in =
865 new ObjectInputStream(new BufferedInputStream(bin));
866 ReentrantLock r = (ReentrantLock) in.readObject();
867 r.lock();
868 r.unlock();
869 }
870
871 /**
872 * toString indicates current lock state
873 */
874 public void testToString() {
875 ReentrantLock lock = new ReentrantLock();
876 String us = lock.toString();
877 assertTrue(us.indexOf("Unlocked") >= 0);
878 lock.lock();
879 String ls = lock.toString();
880 assertTrue(ls.indexOf("Locked") >= 0);
881 }
882
883 }