ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.31
Committed: Sat Nov 21 02:33:20 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.30: +4 -3 lines
Log Message:
import static TimeUnit.MILLISECONDS

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
63 /**
64 * Constructor sets given fairness
65 */
66 public void testConstructor() {
67 assertFalse(new ReentrantLock().isFair());
68 assertFalse(new ReentrantLock(false).isFair());
69 assertTrue(new ReentrantLock(true).isFair());
70 }
71
72 /**
73 * locking an unlocked lock succeeds
74 */
75 public void testLock() {
76 ReentrantLock rl = new ReentrantLock();
77 rl.lock();
78 assertTrue(rl.isLocked());
79 rl.unlock();
80 assertFalse(rl.isLocked());
81 }
82
83 /**
84 * locking an unlocked fair lock succeeds
85 */
86 public void testFairLock() {
87 ReentrantLock rl = new ReentrantLock(true);
88 rl.lock();
89 assertTrue(rl.isLocked());
90 rl.unlock();
91 }
92
93 /**
94 * Unlocking an unlocked lock throws IllegalMonitorStateException
95 */
96 public void testUnlock_IllegalMonitorStateException() {
97 ReentrantLock rl = new ReentrantLock();
98 try {
99 rl.unlock();
100 shouldThrow();
101 } catch (IllegalMonitorStateException success) {}
102 }
103
104 /**
105 * tryLock on an unlocked lock succeeds
106 */
107 public void testTryLock() {
108 ReentrantLock rl = new ReentrantLock();
109 assertTrue(rl.tryLock());
110 assertTrue(rl.isLocked());
111 rl.unlock();
112 }
113
114
115 /**
116 * hasQueuedThreads reports whether there are waiting threads
117 */
118 public void testhasQueuedThreads() throws InterruptedException {
119 final ReentrantLock lock = new ReentrantLock();
120 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
121 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
122 assertFalse(lock.hasQueuedThreads());
123 lock.lock();
124 t1.start();
125 Thread.sleep(SHORT_DELAY_MS);
126 assertTrue(lock.hasQueuedThreads());
127 t2.start();
128 Thread.sleep(SHORT_DELAY_MS);
129 assertTrue(lock.hasQueuedThreads());
130 t1.interrupt();
131 Thread.sleep(SHORT_DELAY_MS);
132 assertTrue(lock.hasQueuedThreads());
133 lock.unlock();
134 Thread.sleep(SHORT_DELAY_MS);
135 assertFalse(lock.hasQueuedThreads());
136 t1.join();
137 t2.join();
138 }
139
140 /**
141 * getQueueLength reports number of waiting threads
142 */
143 public void testGetQueueLength() throws InterruptedException {
144 final ReentrantLock lock = new ReentrantLock();
145 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
146 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
147 assertEquals(0, lock.getQueueLength());
148 lock.lock();
149 t1.start();
150 Thread.sleep(SHORT_DELAY_MS);
151 assertEquals(1, lock.getQueueLength());
152 t2.start();
153 Thread.sleep(SHORT_DELAY_MS);
154 assertEquals(2, lock.getQueueLength());
155 t1.interrupt();
156 Thread.sleep(SHORT_DELAY_MS);
157 assertEquals(1, lock.getQueueLength());
158 lock.unlock();
159 Thread.sleep(SHORT_DELAY_MS);
160 assertEquals(0, lock.getQueueLength());
161 t1.join();
162 t2.join();
163 }
164
165 /**
166 * getQueueLength reports number of waiting threads
167 */
168 public void testGetQueueLength_fair() throws InterruptedException {
169 final ReentrantLock lock = new ReentrantLock(true);
170 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
171 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
172 assertEquals(0, lock.getQueueLength());
173 lock.lock();
174 t1.start();
175 Thread.sleep(SHORT_DELAY_MS);
176 assertEquals(1, lock.getQueueLength());
177 t2.start();
178 Thread.sleep(SHORT_DELAY_MS);
179 assertEquals(2, lock.getQueueLength());
180 t1.interrupt();
181 Thread.sleep(SHORT_DELAY_MS);
182 assertEquals(1, lock.getQueueLength());
183 lock.unlock();
184 Thread.sleep(SHORT_DELAY_MS);
185 assertEquals(0, lock.getQueueLength());
186 t1.join();
187 t2.join();
188 }
189
190 /**
191 * hasQueuedThread(null) throws NPE
192 */
193 public void testHasQueuedThreadNPE() {
194 final ReentrantLock sync = new ReentrantLock();
195 try {
196 sync.hasQueuedThread(null);
197 shouldThrow();
198 } catch (NullPointerException success) {}
199 }
200
201 /**
202 * hasQueuedThread reports whether a thread is queued.
203 */
204 public void testHasQueuedThread() throws InterruptedException {
205 final ReentrantLock sync = new ReentrantLock();
206 Thread t1 = new Thread(new InterruptedLockRunnable(sync));
207 Thread t2 = new Thread(new InterruptibleLockRunnable(sync));
208 assertFalse(sync.hasQueuedThread(t1));
209 assertFalse(sync.hasQueuedThread(t2));
210 sync.lock();
211 t1.start();
212 Thread.sleep(SHORT_DELAY_MS);
213 assertTrue(sync.hasQueuedThread(t1));
214 t2.start();
215 Thread.sleep(SHORT_DELAY_MS);
216 assertTrue(sync.hasQueuedThread(t1));
217 assertTrue(sync.hasQueuedThread(t2));
218 t1.interrupt();
219 Thread.sleep(SHORT_DELAY_MS);
220 assertFalse(sync.hasQueuedThread(t1));
221 assertTrue(sync.hasQueuedThread(t2));
222 sync.unlock();
223 Thread.sleep(SHORT_DELAY_MS);
224 assertFalse(sync.hasQueuedThread(t1));
225 Thread.sleep(SHORT_DELAY_MS);
226 assertFalse(sync.hasQueuedThread(t2));
227 t1.join();
228 t2.join();
229 }
230
231
232 /**
233 * getQueuedThreads includes waiting threads
234 */
235 public void testGetQueuedThreads() throws InterruptedException {
236 final PublicReentrantLock lock = new PublicReentrantLock();
237 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
238 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
239 assertTrue(lock.getQueuedThreads().isEmpty());
240 lock.lock();
241 assertTrue(lock.getQueuedThreads().isEmpty());
242 t1.start();
243 Thread.sleep(SHORT_DELAY_MS);
244 assertTrue(lock.getQueuedThreads().contains(t1));
245 t2.start();
246 Thread.sleep(SHORT_DELAY_MS);
247 assertTrue(lock.getQueuedThreads().contains(t1));
248 assertTrue(lock.getQueuedThreads().contains(t2));
249 t1.interrupt();
250 Thread.sleep(SHORT_DELAY_MS);
251 assertFalse(lock.getQueuedThreads().contains(t1));
252 assertTrue(lock.getQueuedThreads().contains(t2));
253 lock.unlock();
254 Thread.sleep(SHORT_DELAY_MS);
255 assertTrue(lock.getQueuedThreads().isEmpty());
256 t1.join();
257 t2.join();
258 }
259
260
261 /**
262 * timed tryLock is interruptible.
263 */
264 public void testInterruptedException2() throws InterruptedException {
265 final ReentrantLock lock = new ReentrantLock();
266 lock.lock();
267 Thread t = new Thread(new CheckedInterruptedRunnable() {
268 public void realRun() throws InterruptedException {
269 lock.tryLock(MEDIUM_DELAY_MS,MILLISECONDS);
270 }});
271
272 t.start();
273 t.interrupt();
274 t.join();
275 }
276
277
278 /**
279 * TryLock on a locked lock fails
280 */
281 public void testTryLockWhenLocked() throws InterruptedException {
282 final ReentrantLock lock = new ReentrantLock();
283 lock.lock();
284 Thread t = new Thread(new CheckedRunnable() {
285 public void realRun() {
286 threadAssertFalse(lock.tryLock());
287 }});
288
289 t.start();
290 t.join();
291 lock.unlock();
292 }
293
294 /**
295 * Timed tryLock on a locked lock times out
296 */
297 public void testTryLock_Timeout() throws InterruptedException {
298 final ReentrantLock lock = new ReentrantLock();
299 lock.lock();
300 Thread t = new Thread(new CheckedRunnable() {
301 public void realRun() throws InterruptedException {
302 threadAssertFalse(lock.tryLock(1, MILLISECONDS));
303 }});
304
305 t.start();
306 t.join();
307 lock.unlock();
308 }
309
310 /**
311 * getHoldCount returns number of recursive holds
312 */
313 public void testGetHoldCount() {
314 ReentrantLock lock = new ReentrantLock();
315 for (int i = 1; i <= SIZE; i++) {
316 lock.lock();
317 assertEquals(i, lock.getHoldCount());
318 }
319 for (int i = SIZE; i > 0; i--) {
320 lock.unlock();
321 assertEquals(i-1, lock.getHoldCount());
322 }
323 }
324
325
326 /**
327 * isLocked is true when locked and false when not
328 */
329 public void testIsLocked() throws InterruptedException {
330 final ReentrantLock lock = new ReentrantLock();
331 lock.lock();
332 assertTrue(lock.isLocked());
333 lock.unlock();
334 assertFalse(lock.isLocked());
335 Thread t = new Thread(new CheckedRunnable() {
336 public void realRun() throws InterruptedException {
337 lock.lock();
338 Thread.sleep(SMALL_DELAY_MS);
339 lock.unlock();
340 }});
341
342 t.start();
343 Thread.sleep(SHORT_DELAY_MS);
344 assertTrue(lock.isLocked());
345 t.join();
346 assertFalse(lock.isLocked());
347 }
348
349
350 /**
351 * lockInterruptibly is interruptible.
352 */
353 public void testLockInterruptibly1() throws InterruptedException {
354 final ReentrantLock lock = new ReentrantLock();
355 lock.lock();
356 Thread t = new Thread(new InterruptedLockRunnable(lock));
357 t.start();
358 Thread.sleep(SHORT_DELAY_MS);
359 t.interrupt();
360 Thread.sleep(SHORT_DELAY_MS);
361 lock.unlock();
362 t.join();
363 }
364
365 /**
366 * lockInterruptibly succeeds when unlocked, else is interruptible
367 */
368 public void testLockInterruptibly2() throws InterruptedException {
369 final ReentrantLock lock = new ReentrantLock();
370 lock.lockInterruptibly();
371 Thread t = new Thread(new InterruptedLockRunnable(lock));
372 t.start();
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(1000 * 1000 * 1000); // 1 sec
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 }