ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.34
Committed: Tue Dec 1 09:48:12 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.33: +0 -2 lines
Log Message:
whitespace

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/licenses/publicdomain
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 Thread.sleep(SHORT_DELAY_MS);
124 assertTrue(lock.hasQueuedThreads());
125 t2.start();
126 Thread.sleep(SHORT_DELAY_MS);
127 assertTrue(lock.hasQueuedThreads());
128 t1.interrupt();
129 Thread.sleep(SHORT_DELAY_MS);
130 assertTrue(lock.hasQueuedThreads());
131 lock.unlock();
132 Thread.sleep(SHORT_DELAY_MS);
133 assertFalse(lock.hasQueuedThreads());
134 t1.join();
135 t2.join();
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 Thread.sleep(SHORT_DELAY_MS);
149 assertEquals(1, lock.getQueueLength());
150 t2.start();
151 Thread.sleep(SHORT_DELAY_MS);
152 assertEquals(2, lock.getQueueLength());
153 t1.interrupt();
154 Thread.sleep(SHORT_DELAY_MS);
155 assertEquals(1, lock.getQueueLength());
156 lock.unlock();
157 Thread.sleep(SHORT_DELAY_MS);
158 assertEquals(0, lock.getQueueLength());
159 t1.join();
160 t2.join();
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 Thread.sleep(SHORT_DELAY_MS);
174 assertEquals(1, lock.getQueueLength());
175 t2.start();
176 Thread.sleep(SHORT_DELAY_MS);
177 assertEquals(2, lock.getQueueLength());
178 t1.interrupt();
179 Thread.sleep(SHORT_DELAY_MS);
180 assertEquals(1, lock.getQueueLength());
181 lock.unlock();
182 Thread.sleep(SHORT_DELAY_MS);
183 assertEquals(0, lock.getQueueLength());
184 t1.join();
185 t2.join();
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 Thread.sleep(SHORT_DELAY_MS);
211 assertTrue(sync.hasQueuedThread(t1));
212 t2.start();
213 Thread.sleep(SHORT_DELAY_MS);
214 assertTrue(sync.hasQueuedThread(t1));
215 assertTrue(sync.hasQueuedThread(t2));
216 t1.interrupt();
217 Thread.sleep(SHORT_DELAY_MS);
218 assertFalse(sync.hasQueuedThread(t1));
219 assertTrue(sync.hasQueuedThread(t2));
220 sync.unlock();
221 Thread.sleep(SHORT_DELAY_MS);
222 assertFalse(sync.hasQueuedThread(t1));
223 Thread.sleep(SHORT_DELAY_MS);
224 assertFalse(sync.hasQueuedThread(t2));
225 t1.join();
226 t2.join();
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 Thread.sleep(SHORT_DELAY_MS);
242 assertTrue(lock.getQueuedThreads().contains(t1));
243 t2.start();
244 Thread.sleep(SHORT_DELAY_MS);
245 assertTrue(lock.getQueuedThreads().contains(t1));
246 assertTrue(lock.getQueuedThreads().contains(t2));
247 t1.interrupt();
248 Thread.sleep(SHORT_DELAY_MS);
249 assertFalse(lock.getQueuedThreads().contains(t1));
250 assertTrue(lock.getQueuedThreads().contains(t2));
251 lock.unlock();
252 Thread.sleep(SHORT_DELAY_MS);
253 assertTrue(lock.getQueuedThreads().isEmpty());
254 t1.join();
255 t2.join();
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 = new Thread(new CheckedInterruptedRunnable() {
266 public void realRun() throws InterruptedException {
267 lock.tryLock(MEDIUM_DELAY_MS,MILLISECONDS);
268 }});
269
270 t.start();
271 Thread.sleep(SHORT_DELAY_MS);
272 t.interrupt();
273 t.join();
274 }
275
276
277 /**
278 * TryLock on a locked lock fails
279 */
280 public void testTryLockWhenLocked() throws InterruptedException {
281 final ReentrantLock lock = new ReentrantLock();
282 lock.lock();
283 Thread t = new Thread(new CheckedRunnable() {
284 public void realRun() {
285 threadAssertFalse(lock.tryLock());
286 }});
287
288 t.start();
289 t.join();
290 lock.unlock();
291 }
292
293 /**
294 * Timed tryLock on a locked lock times out
295 */
296 public void testTryLock_Timeout() throws InterruptedException {
297 final ReentrantLock lock = new ReentrantLock();
298 lock.lock();
299 Thread t = new Thread(new CheckedRunnable() {
300 public void realRun() throws InterruptedException {
301 threadAssertFalse(lock.tryLock(1, MILLISECONDS));
302 }});
303
304 t.start();
305 t.join();
306 lock.unlock();
307 }
308
309 /**
310 * getHoldCount returns number of recursive holds
311 */
312 public void testGetHoldCount() {
313 ReentrantLock lock = new ReentrantLock();
314 for (int i = 1; i <= SIZE; i++) {
315 lock.lock();
316 assertEquals(i, lock.getHoldCount());
317 }
318 for (int i = SIZE; i > 0; i--) {
319 lock.unlock();
320 assertEquals(i-1, lock.getHoldCount());
321 }
322 }
323
324
325 /**
326 * isLocked is true when locked and false when not
327 */
328 public void testIsLocked() throws InterruptedException {
329 final ReentrantLock lock = new ReentrantLock();
330 lock.lock();
331 assertTrue(lock.isLocked());
332 lock.unlock();
333 assertFalse(lock.isLocked());
334 Thread t = new Thread(new CheckedRunnable() {
335 public void realRun() throws InterruptedException {
336 lock.lock();
337 Thread.sleep(SMALL_DELAY_MS);
338 lock.unlock();
339 }});
340
341 t.start();
342 Thread.sleep(SHORT_DELAY_MS);
343 assertTrue(lock.isLocked());
344 t.join();
345 assertFalse(lock.isLocked());
346 }
347
348
349 /**
350 * lockInterruptibly is interruptible.
351 */
352 public void testLockInterruptibly1() throws InterruptedException {
353 final ReentrantLock lock = new ReentrantLock();
354 lock.lock();
355 Thread t = new Thread(new InterruptedLockRunnable(lock));
356 t.start();
357 Thread.sleep(SHORT_DELAY_MS);
358 t.interrupt();
359 Thread.sleep(SHORT_DELAY_MS);
360 lock.unlock();
361 t.join();
362 }
363
364 /**
365 * lockInterruptibly succeeds when unlocked, else is interruptible
366 */
367 public void testLockInterruptibly2() throws InterruptedException {
368 final ReentrantLock lock = new ReentrantLock();
369 lock.lockInterruptibly();
370 Thread t = new Thread(new InterruptedLockRunnable(lock));
371 t.start();
372 Thread.sleep(SHORT_DELAY_MS);
373 t.interrupt();
374 assertTrue(lock.isLocked());
375 assertTrue(lock.isHeldByCurrentThread());
376 t.join();
377 }
378
379 /**
380 * Calling await without holding lock throws IllegalMonitorStateException
381 */
382 public void testAwait_IllegalMonitor() throws InterruptedException {
383 final ReentrantLock lock = new ReentrantLock();
384 final Condition c = lock.newCondition();
385 try {
386 c.await();
387 shouldThrow();
388 } catch (IllegalMonitorStateException success) {}
389 }
390
391 /**
392 * Calling signal without holding lock throws IllegalMonitorStateException
393 */
394 public void testSignal_IllegalMonitor() {
395 final ReentrantLock lock = new ReentrantLock();
396 final Condition c = lock.newCondition();
397 try {
398 c.signal();
399 shouldThrow();
400 } catch (IllegalMonitorStateException success) {}
401 }
402
403 /**
404 * awaitNanos without a signal times out
405 */
406 public void testAwaitNanos_Timeout() throws InterruptedException {
407 final ReentrantLock lock = new ReentrantLock();
408 final Condition c = lock.newCondition();
409 lock.lock();
410 long t = c.awaitNanos(100);
411 assertTrue(t <= 0);
412 lock.unlock();
413 }
414
415 /**
416 * timed await without a signal times out
417 */
418 public void testAwait_Timeout() throws InterruptedException {
419 final ReentrantLock lock = new ReentrantLock();
420 final Condition c = lock.newCondition();
421 lock.lock();
422 assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
423 lock.unlock();
424 }
425
426 /**
427 * awaitUntil without a signal times out
428 */
429 public void testAwaitUntil_Timeout() throws InterruptedException {
430 final ReentrantLock lock = new ReentrantLock();
431 final Condition c = lock.newCondition();
432 lock.lock();
433 java.util.Date d = new java.util.Date();
434 assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
435 lock.unlock();
436 }
437
438 /**
439 * await returns when signalled
440 */
441 public void testAwait() throws InterruptedException {
442 final ReentrantLock lock = new ReentrantLock();
443 final Condition c = lock.newCondition();
444 Thread t = new Thread(new CheckedRunnable() {
445 public void realRun() throws InterruptedException {
446 lock.lock();
447 c.await();
448 lock.unlock();
449 }});
450
451 t.start();
452 Thread.sleep(SHORT_DELAY_MS);
453 lock.lock();
454 c.signal();
455 lock.unlock();
456 t.join(SHORT_DELAY_MS);
457 assertFalse(t.isAlive());
458 }
459
460 /**
461 * hasWaiters throws NPE if null
462 */
463 public void testHasWaitersNPE() {
464 final ReentrantLock lock = new ReentrantLock();
465 try {
466 lock.hasWaiters(null);
467 shouldThrow();
468 } catch (NullPointerException success) {}
469 }
470
471 /**
472 * getWaitQueueLength throws NPE if null
473 */
474 public void testGetWaitQueueLengthNPE() {
475 final ReentrantLock lock = new ReentrantLock();
476 try {
477 lock.getWaitQueueLength(null);
478 shouldThrow();
479 } catch (NullPointerException success) {}
480 }
481
482
483 /**
484 * getWaitingThreads throws NPE if null
485 */
486 public void testGetWaitingThreadsNPE() {
487 final PublicReentrantLock lock = new PublicReentrantLock();
488 try {
489 lock.getWaitingThreads(null);
490 shouldThrow();
491 } catch (NullPointerException success) {}
492 }
493
494
495 /**
496 * hasWaiters throws IAE if not owned
497 */
498 public void testHasWaitersIAE() {
499 final ReentrantLock lock = new ReentrantLock();
500 final Condition c = lock.newCondition();
501 final ReentrantLock lock2 = new ReentrantLock();
502 try {
503 lock2.hasWaiters(c);
504 shouldThrow();
505 } catch (IllegalArgumentException success) {}
506 }
507
508 /**
509 * hasWaiters throws IMSE if not locked
510 */
511 public void testHasWaitersIMSE() {
512 final ReentrantLock lock = new ReentrantLock();
513 final Condition c = lock.newCondition();
514 try {
515 lock.hasWaiters(c);
516 shouldThrow();
517 } catch (IllegalMonitorStateException success) {}
518 }
519
520
521 /**
522 * getWaitQueueLength throws IAE if not owned
523 */
524 public void testGetWaitQueueLengthIAE() {
525 final ReentrantLock lock = new ReentrantLock();
526 final Condition c = lock.newCondition();
527 final ReentrantLock lock2 = new ReentrantLock();
528 try {
529 lock2.getWaitQueueLength(c);
530 shouldThrow();
531 } catch (IllegalArgumentException success) {}
532 }
533
534 /**
535 * getWaitQueueLength throws IMSE if not locked
536 */
537 public void testGetWaitQueueLengthIMSE() {
538 final ReentrantLock lock = new ReentrantLock();
539 final Condition c = lock.newCondition();
540 try {
541 lock.getWaitQueueLength(c);
542 shouldThrow();
543 } catch (IllegalMonitorStateException success) {}
544 }
545
546
547 /**
548 * getWaitingThreads throws IAE if not owned
549 */
550 public void testGetWaitingThreadsIAE() {
551 final PublicReentrantLock lock = new PublicReentrantLock();
552 final Condition c = lock.newCondition();
553 final PublicReentrantLock lock2 = new PublicReentrantLock();
554 try {
555 lock2.getWaitingThreads(c);
556 shouldThrow();
557 } catch (IllegalArgumentException success) {}
558 }
559
560 /**
561 * getWaitingThreads throws IMSE if not locked
562 */
563 public void testGetWaitingThreadsIMSE() {
564 final PublicReentrantLock lock = new PublicReentrantLock();
565 final Condition c = lock.newCondition();
566 try {
567 lock.getWaitingThreads(c);
568 shouldThrow();
569 } catch (IllegalMonitorStateException success) {}
570 }
571
572
573 /**
574 * hasWaiters returns true when a thread is waiting, else false
575 */
576 public void testHasWaiters() throws InterruptedException {
577 final ReentrantLock lock = new ReentrantLock();
578 final Condition c = lock.newCondition();
579 Thread t = new Thread(new CheckedRunnable() {
580 public void realRun() throws InterruptedException {
581 lock.lock();
582 threadAssertFalse(lock.hasWaiters(c));
583 threadAssertEquals(0, lock.getWaitQueueLength(c));
584 c.await();
585 lock.unlock();
586 }});
587
588 t.start();
589 Thread.sleep(SHORT_DELAY_MS);
590 lock.lock();
591 assertTrue(lock.hasWaiters(c));
592 assertEquals(1, lock.getWaitQueueLength(c));
593 c.signal();
594 lock.unlock();
595 Thread.sleep(SHORT_DELAY_MS);
596 lock.lock();
597 assertFalse(lock.hasWaiters(c));
598 assertEquals(0, lock.getWaitQueueLength(c));
599 lock.unlock();
600 t.join(SHORT_DELAY_MS);
601 assertFalse(t.isAlive());
602 }
603
604 /**
605 * getWaitQueueLength returns number of waiting threads
606 */
607 public void testGetWaitQueueLength() throws InterruptedException {
608 final ReentrantLock lock = new ReentrantLock();
609 final Condition c = lock.newCondition();
610 Thread t1 = new Thread(new CheckedRunnable() {
611 public void realRun() throws InterruptedException {
612 lock.lock();
613 threadAssertFalse(lock.hasWaiters(c));
614 threadAssertEquals(0, lock.getWaitQueueLength(c));
615 c.await();
616 lock.unlock();
617 }});
618
619 Thread t2 = new Thread(new CheckedRunnable() {
620 public void realRun() throws InterruptedException {
621 lock.lock();
622 threadAssertTrue(lock.hasWaiters(c));
623 threadAssertEquals(1, lock.getWaitQueueLength(c));
624 c.await();
625 lock.unlock();
626 }});
627
628 t1.start();
629 Thread.sleep(SHORT_DELAY_MS);
630 t2.start();
631 Thread.sleep(SHORT_DELAY_MS);
632 lock.lock();
633 assertTrue(lock.hasWaiters(c));
634 assertEquals(2, lock.getWaitQueueLength(c));
635 c.signalAll();
636 lock.unlock();
637 Thread.sleep(SHORT_DELAY_MS);
638 lock.lock();
639 assertFalse(lock.hasWaiters(c));
640 assertEquals(0, lock.getWaitQueueLength(c));
641 lock.unlock();
642 t1.join(SHORT_DELAY_MS);
643 t2.join(SHORT_DELAY_MS);
644 assertFalse(t1.isAlive());
645 assertFalse(t2.isAlive());
646 }
647
648 /**
649 * getWaitingThreads returns only and all waiting threads
650 */
651 public void testGetWaitingThreads() throws InterruptedException {
652 final PublicReentrantLock lock = new PublicReentrantLock();
653 final Condition c = lock.newCondition();
654 Thread t1 = new Thread(new CheckedRunnable() {
655 public void realRun() throws InterruptedException {
656 lock.lock();
657 threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
658 c.await();
659 lock.unlock();
660 }});
661
662 Thread t2 = new Thread(new CheckedRunnable() {
663 public void realRun() throws InterruptedException {
664 lock.lock();
665 threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
666 c.await();
667 lock.unlock();
668 }});
669
670 lock.lock();
671 assertTrue(lock.getWaitingThreads(c).isEmpty());
672 lock.unlock();
673 t1.start();
674 Thread.sleep(SHORT_DELAY_MS);
675 t2.start();
676 Thread.sleep(SHORT_DELAY_MS);
677 lock.lock();
678 assertTrue(lock.hasWaiters(c));
679 assertTrue(lock.getWaitingThreads(c).contains(t1));
680 assertTrue(lock.getWaitingThreads(c).contains(t2));
681 c.signalAll();
682 lock.unlock();
683 Thread.sleep(SHORT_DELAY_MS);
684 lock.lock();
685 assertFalse(lock.hasWaiters(c));
686 assertTrue(lock.getWaitingThreads(c).isEmpty());
687 lock.unlock();
688 t1.join(SHORT_DELAY_MS);
689 t2.join(SHORT_DELAY_MS);
690 assertFalse(t1.isAlive());
691 assertFalse(t2.isAlive());
692 }
693
694 /** A helper class for uninterruptible wait tests */
695 class UninterruptibleThread extends Thread {
696 private ReentrantLock lock;
697 private Condition c;
698
699 public volatile boolean canAwake = false;
700 public volatile boolean interrupted = false;
701 public volatile boolean lockStarted = false;
702
703 public UninterruptibleThread(ReentrantLock lock, Condition c) {
704 this.lock = lock;
705 this.c = c;
706 }
707
708 public synchronized void run() {
709 lock.lock();
710 lockStarted = true;
711
712 while (!canAwake) {
713 c.awaitUninterruptibly();
714 }
715
716 interrupted = isInterrupted();
717 lock.unlock();
718 }
719 }
720
721 /**
722 * awaitUninterruptibly doesn't abort on interrupt
723 */
724 public void testAwaitUninterruptibly() throws InterruptedException {
725 final ReentrantLock lock = new ReentrantLock();
726 final Condition c = lock.newCondition();
727 UninterruptibleThread thread = new UninterruptibleThread(lock, c);
728
729 thread.start();
730
731 while (!thread.lockStarted) {
732 Thread.sleep(100);
733 }
734
735 lock.lock();
736 try {
737 thread.interrupt();
738 thread.canAwake = true;
739 c.signal();
740 } finally {
741 lock.unlock();
742 }
743
744 thread.join();
745 assertTrue(thread.interrupted);
746 assertFalse(thread.isAlive());
747 }
748
749 /**
750 * await is interruptible
751 */
752 public void testAwait_Interrupt() throws InterruptedException {
753 final ReentrantLock lock = new ReentrantLock();
754 final Condition c = lock.newCondition();
755 Thread t = new Thread(new CheckedInterruptedRunnable() {
756 public void realRun() throws InterruptedException {
757 lock.lock();
758 c.await();
759 }});
760
761 t.start();
762 Thread.sleep(SHORT_DELAY_MS);
763 t.interrupt();
764 t.join(SHORT_DELAY_MS);
765 assertFalse(t.isAlive());
766 }
767
768 /**
769 * awaitNanos is interruptible
770 */
771 public void testAwaitNanos_Interrupt() throws InterruptedException {
772 final ReentrantLock lock = new ReentrantLock();
773 final Condition c = lock.newCondition();
774 Thread t = new Thread(new CheckedInterruptedRunnable() {
775 public void realRun() throws InterruptedException {
776 lock.lock();
777 c.awaitNanos(MILLISECONDS.toNanos(LONG_DELAY_MS));
778 }});
779
780 t.start();
781 Thread.sleep(SHORT_DELAY_MS);
782 t.interrupt();
783 t.join(SHORT_DELAY_MS);
784 assertFalse(t.isAlive());
785 }
786
787 /**
788 * awaitUntil is interruptible
789 */
790 public void testAwaitUntil_Interrupt() throws InterruptedException {
791 final ReentrantLock lock = new ReentrantLock();
792 final Condition c = lock.newCondition();
793 Thread t = new Thread(new CheckedInterruptedRunnable() {
794 public void realRun() throws InterruptedException {
795 lock.lock();
796 java.util.Date d = new java.util.Date();
797 c.awaitUntil(new java.util.Date(d.getTime() + 10000));
798 }});
799
800 t.start();
801 Thread.sleep(SHORT_DELAY_MS);
802 t.interrupt();
803 t.join(SHORT_DELAY_MS);
804 assertFalse(t.isAlive());
805 }
806
807 /**
808 * signalAll wakes up all threads
809 */
810 public void testSignalAll() throws InterruptedException {
811 final ReentrantLock lock = new ReentrantLock();
812 final Condition c = lock.newCondition();
813 Thread t1 = new Thread(new CheckedRunnable() {
814 public void realRun() throws InterruptedException {
815 lock.lock();
816 c.await();
817 lock.unlock();
818 }});
819
820 Thread t2 = new Thread(new CheckedRunnable() {
821 public void realRun() throws InterruptedException {
822 lock.lock();
823 c.await();
824 lock.unlock();
825 }});
826
827 t1.start();
828 t2.start();
829 Thread.sleep(SHORT_DELAY_MS);
830 lock.lock();
831 c.signalAll();
832 lock.unlock();
833 t1.join(SHORT_DELAY_MS);
834 t2.join(SHORT_DELAY_MS);
835 assertFalse(t1.isAlive());
836 assertFalse(t2.isAlive());
837 }
838
839 /**
840 * await after multiple reentrant locking preserves lock count
841 */
842 public void testAwaitLockCount() throws InterruptedException {
843 final ReentrantLock lock = new ReentrantLock();
844 final Condition c = lock.newCondition();
845 Thread t1 = new Thread(new CheckedRunnable() {
846 public void realRun() throws InterruptedException {
847 lock.lock();
848 threadAssertEquals(1, lock.getHoldCount());
849 c.await();
850 threadAssertEquals(1, lock.getHoldCount());
851 lock.unlock();
852 }});
853
854 Thread t2 = new Thread(new CheckedRunnable() {
855 public void realRun() throws InterruptedException {
856 lock.lock();
857 lock.lock();
858 threadAssertEquals(2, lock.getHoldCount());
859 c.await();
860 threadAssertEquals(2, lock.getHoldCount());
861 lock.unlock();
862 lock.unlock();
863 }});
864
865 t1.start();
866 t2.start();
867 Thread.sleep(SHORT_DELAY_MS);
868 lock.lock();
869 c.signalAll();
870 lock.unlock();
871 t1.join(SHORT_DELAY_MS);
872 t2.join(SHORT_DELAY_MS);
873 assertFalse(t1.isAlive());
874 assertFalse(t2.isAlive());
875 }
876
877 /**
878 * A serialized lock deserializes as unlocked
879 */
880 public void testSerialization() throws Exception {
881 ReentrantLock l = new ReentrantLock();
882 l.lock();
883 l.unlock();
884
885 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
886 ObjectOutputStream out =
887 new ObjectOutputStream(new BufferedOutputStream(bout));
888 out.writeObject(l);
889 out.close();
890
891 ByteArrayInputStream bin =
892 new ByteArrayInputStream(bout.toByteArray());
893 ObjectInputStream in =
894 new ObjectInputStream(new BufferedInputStream(bin));
895 ReentrantLock r = (ReentrantLock) in.readObject();
896 r.lock();
897 r.unlock();
898 }
899
900 /**
901 * toString indicates current lock state
902 */
903 public void testToString() {
904 ReentrantLock lock = new ReentrantLock();
905 String us = lock.toString();
906 assertTrue(us.indexOf("Unlocked") >= 0);
907 lock.lock();
908 String ls = lock.toString();
909 assertTrue(ls.indexOf("Locked") >= 0);
910 }
911
912 }