ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.43
Committed: Sat May 7 03:36:23 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.42: +40 -3 lines
Log Message:
improve testAwait_Interrupt

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