ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.32
Committed: Mon Nov 30 08:31:09 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.31: +3 -1 lines
Log Message:
replace absolute waits with _DELAY_MS; 1000 => 1000L; short delay after starting a thread before interrupting it

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