ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.13
Committed: Sun Dec 28 21:56:18 2003 UTC (20 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.12: +192 -18 lines
Log Message:
Add tests for AQS extensions; adjust others for protected condition methods

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 java.io.*;
13 import java.util.*;
14
15 public class ReentrantReadWriteLockTest extends JSR166TestCase {
16 public static void main(String[] args) {
17 junit.textui.TestRunner.run (suite());
18 }
19 public static Test suite() {
20 return new TestSuite(ReentrantReadWriteLockTest.class);
21 }
22
23 /**
24 * A runnable calling lockInterruptibly
25 */
26 class InterruptibleLockRunnable implements Runnable {
27 final ReentrantReadWriteLock lock;
28 InterruptibleLockRunnable(ReentrantReadWriteLock l) { lock = l; }
29 public void run() {
30 try {
31 lock.writeLock().lockInterruptibly();
32 } catch(InterruptedException success){}
33 }
34 }
35
36
37 /**
38 * A runnable calling lockInterruptibly that expects to be
39 * interrupted
40 */
41 class InterruptedLockRunnable implements Runnable {
42 final ReentrantReadWriteLock lock;
43 InterruptedLockRunnable(ReentrantReadWriteLock l) { lock = l; }
44 public void run() {
45 try {
46 lock.writeLock().lockInterruptibly();
47 threadShouldThrow();
48 } catch(InterruptedException success){}
49 }
50 }
51
52 /**
53 * Subclass to expose protected methods
54 */
55 static class PublicReentrantReadWriteLock extends ReentrantReadWriteLock {
56 PublicReentrantReadWriteLock() { super(); }
57 public Collection<Thread> getQueuedThreads() {
58 return super.getQueuedThreads();
59 }
60 public Collection<Thread> getWaitingThreads(Condition c) {
61 return super.getWaitingThreads(c);
62 }
63 }
64
65 /**
66 * Constructor sets given fairness, and is in unlocked state
67 */
68 public void testConstructor() {
69 ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
70 assertFalse(rl.isFair());
71 assertFalse(rl.isWriteLocked());
72 assertEquals(0, rl.getReadLockCount());
73 ReentrantReadWriteLock r2 = new ReentrantReadWriteLock(true);
74 assertTrue(r2.isFair());
75 assertFalse(r2.isWriteLocked());
76 assertEquals(0, r2.getReadLockCount());
77 }
78
79 /**
80 * write-locking and read-locking an unlocked lock succeed
81 */
82 public void testLock() {
83 ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
84 rl.writeLock().lock();
85 assertTrue(rl.isWriteLocked());
86 assertTrue(rl.isWriteLockedByCurrentThread());
87 assertEquals(0, rl.getReadLockCount());
88 rl.writeLock().unlock();
89 assertFalse(rl.isWriteLocked());
90 assertFalse(rl.isWriteLockedByCurrentThread());
91 assertEquals(0, rl.getReadLockCount());
92 rl.readLock().lock();
93 assertFalse(rl.isWriteLocked());
94 assertFalse(rl.isWriteLockedByCurrentThread());
95 assertEquals(1, rl.getReadLockCount());
96 rl.readLock().unlock();
97 assertFalse(rl.isWriteLocked());
98 assertFalse(rl.isWriteLockedByCurrentThread());
99 assertEquals(0, rl.getReadLockCount());
100 }
101
102
103 /**
104 * locking an unlocked fair lock succeeds
105 */
106 public void testFairLock() {
107 ReentrantReadWriteLock rl = new ReentrantReadWriteLock(true);
108 rl.writeLock().lock();
109 assertTrue(rl.isWriteLocked());
110 assertTrue(rl.isWriteLockedByCurrentThread());
111 assertEquals(0, rl.getReadLockCount());
112 rl.writeLock().unlock();
113 assertFalse(rl.isWriteLocked());
114 assertFalse(rl.isWriteLockedByCurrentThread());
115 assertEquals(0, rl.getReadLockCount());
116 rl.readLock().lock();
117 assertFalse(rl.isWriteLocked());
118 assertFalse(rl.isWriteLockedByCurrentThread());
119 assertEquals(1, rl.getReadLockCount());
120 rl.readLock().unlock();
121 assertFalse(rl.isWriteLocked());
122 assertFalse(rl.isWriteLockedByCurrentThread());
123 assertEquals(0, rl.getReadLockCount());
124 }
125
126 /**
127 * getWriteHoldCount returns number of recursive holds
128 */
129 public void testGetHoldCount() {
130 ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
131 for(int i = 1; i <= SIZE; i++) {
132 lock.writeLock().lock();
133 assertEquals(i,lock.getWriteHoldCount());
134 }
135 for(int i = SIZE; i > 0; i--) {
136 lock.writeLock().unlock();
137 assertEquals(i-1,lock.getWriteHoldCount());
138 }
139 }
140
141
142 /**
143 * write-unlocking an unlocked lock throws IllegalMonitorStateException
144 */
145 public void testUnlock_IllegalMonitorStateException() {
146 ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
147 try {
148 rl.writeLock().unlock();
149 shouldThrow();
150 } catch(IllegalMonitorStateException success){}
151 }
152
153
154 /**
155 * write-lockInterruptibly is interruptible
156 */
157 public void testWriteLockInterruptibly_Interrupted() {
158 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
159 lock.writeLock().lock();
160 Thread t = new Thread(new Runnable() {
161 public void run() {
162 try {
163 lock.writeLock().lockInterruptibly();
164 threadShouldThrow();
165 } catch(InterruptedException success){}
166 }
167 });
168 try {
169 t.start();
170 t.interrupt();
171 lock.writeLock().unlock();
172 t.join();
173 } catch(Exception e){
174 unexpectedException();
175 }
176 }
177
178 /**
179 * timed write-trylock is interruptible
180 */
181 public void testWriteTryLock_Interrupted() {
182 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
183 lock.writeLock().lock();
184 Thread t = new Thread(new Runnable() {
185 public void run() {
186 try {
187 lock.writeLock().tryLock(1000,TimeUnit.MILLISECONDS);
188 threadShouldThrow();
189 } catch(InterruptedException success){}
190 }
191 });
192 try {
193 t.start();
194 t.interrupt();
195 lock.writeLock().unlock();
196 t.join();
197 } catch(Exception e){
198 unexpectedException();
199 }
200 }
201
202 /**
203 * read-lockInterruptibly is interruptible
204 */
205 public void testReadLockInterruptibly_Interrupted() {
206 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
207 lock.writeLock().lock();
208 Thread t = new Thread(new Runnable() {
209 public void run() {
210 try {
211 lock.readLock().lockInterruptibly();
212 threadShouldThrow();
213 } catch(InterruptedException success){}
214 }
215 });
216 try {
217 t.start();
218 t.interrupt();
219 lock.writeLock().unlock();
220 t.join();
221 } catch(Exception e){
222 unexpectedException();
223 }
224 }
225
226 /**
227 * timed read-trylock is interruptible
228 */
229 public void testReadTryLock_Interrupted() {
230 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
231 lock.writeLock().lock();
232 Thread t = new Thread(new Runnable() {
233 public void run() {
234 try {
235 lock.readLock().tryLock(1000,TimeUnit.MILLISECONDS);
236 threadShouldThrow();
237 } catch(InterruptedException success){}
238 }
239 });
240 try {
241 t.start();
242 t.interrupt();
243 t.join();
244 } catch(Exception e){
245 unexpectedException();
246 }
247 }
248
249
250 /**
251 * write-trylock fails if locked
252 */
253 public void testWriteTryLockWhenLocked() {
254 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
255 lock.writeLock().lock();
256 Thread t = new Thread(new Runnable() {
257 public void run() {
258 threadAssertFalse(lock.writeLock().tryLock());
259 }
260 });
261 try {
262 t.start();
263 t.join();
264 lock.writeLock().unlock();
265 } catch(Exception e){
266 unexpectedException();
267 }
268 }
269
270 /**
271 * read-trylock fails if locked
272 */
273 public void testReadTryLockWhenLocked() {
274 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
275 lock.writeLock().lock();
276 Thread t = new Thread(new Runnable() {
277 public void run() {
278 threadAssertFalse(lock.readLock().tryLock());
279 }
280 });
281 try {
282 t.start();
283 t.join();
284 lock.writeLock().unlock();
285 } catch(Exception e){
286 unexpectedException();
287 }
288 }
289
290 /**
291 * Multiple threads can hold a read lock when not write-locked
292 */
293 public void testMultipleReadLocks() {
294 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
295 lock.readLock().lock();
296 Thread t = new Thread(new Runnable() {
297 public void run() {
298 threadAssertTrue(lock.readLock().tryLock());
299 lock.readLock().unlock();
300 }
301 });
302 try {
303 t.start();
304 t.join();
305 lock.readLock().unlock();
306 } catch(Exception e){
307 unexpectedException();
308 }
309 }
310
311 /**
312 * A writelock succeeds after reading threads unlock
313 */
314 public void testWriteAfterMultipleReadLocks() {
315 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
316 lock.readLock().lock();
317 Thread t1 = new Thread(new Runnable() {
318 public void run() {
319 lock.readLock().lock();
320 lock.readLock().unlock();
321 }
322 });
323 Thread t2 = new Thread(new Runnable() {
324 public void run() {
325 lock.writeLock().lock();
326 lock.writeLock().unlock();
327 }
328 });
329
330 try {
331 t1.start();
332 t2.start();
333 Thread.sleep(SHORT_DELAY_MS);
334 lock.readLock().unlock();
335 t1.join(MEDIUM_DELAY_MS);
336 t2.join(MEDIUM_DELAY_MS);
337 assertTrue(!t1.isAlive());
338 assertTrue(!t2.isAlive());
339
340 } catch(Exception e){
341 unexpectedException();
342 }
343 }
344
345 /**
346 * Readlocks succeed after a writing thread unlocks
347 */
348 public void testReadAfterWriteLock() {
349 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
350 lock.writeLock().lock();
351 Thread t1 = new Thread(new Runnable() {
352 public void run() {
353 lock.readLock().lock();
354 lock.readLock().unlock();
355 }
356 });
357 Thread t2 = new Thread(new Runnable() {
358 public void run() {
359 lock.readLock().lock();
360 lock.readLock().unlock();
361 }
362 });
363
364 try {
365 t1.start();
366 t2.start();
367 Thread.sleep(SHORT_DELAY_MS);
368 lock.writeLock().unlock();
369 t1.join(MEDIUM_DELAY_MS);
370 t2.join(MEDIUM_DELAY_MS);
371 assertTrue(!t1.isAlive());
372 assertTrue(!t2.isAlive());
373
374 } catch(Exception e){
375 unexpectedException();
376 }
377 }
378
379
380 /**
381 * Read trylock succeeds if readlocked but not writelocked
382 */
383 public void testTryLockWhenReadLocked() {
384 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
385 lock.readLock().lock();
386 Thread t = new Thread(new Runnable() {
387 public void run() {
388 threadAssertTrue(lock.readLock().tryLock());
389 lock.readLock().unlock();
390 }
391 });
392 try {
393 t.start();
394 t.join();
395 lock.readLock().unlock();
396 } catch(Exception e){
397 unexpectedException();
398 }
399 }
400
401
402
403 /**
404 * write trylock fails when readlocked
405 */
406 public void testWriteTryLockWhenReadLocked() {
407 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
408 lock.readLock().lock();
409 Thread t = new Thread(new Runnable() {
410 public void run() {
411 threadAssertFalse(lock.writeLock().tryLock());
412 }
413 });
414 try {
415 t.start();
416 t.join();
417 lock.readLock().unlock();
418 } catch(Exception e){
419 unexpectedException();
420 }
421 }
422
423
424
425 /**
426 * write timed trylock times out if locked
427 */
428 public void testWriteTryLock_Timeout() {
429 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
430 lock.writeLock().lock();
431 Thread t = new Thread(new Runnable() {
432 public void run() {
433 try {
434 threadAssertFalse(lock.writeLock().tryLock(1, TimeUnit.MILLISECONDS));
435 } catch (Exception ex) {
436 threadUnexpectedException();
437 }
438 }
439 });
440 try {
441 t.start();
442 t.join();
443 lock.writeLock().unlock();
444 } catch(Exception e){
445 unexpectedException();
446 }
447 }
448
449 /**
450 * read timed trylock times out if write-locked
451 */
452 public void testReadTryLock_Timeout() {
453 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
454 lock.writeLock().lock();
455 Thread t = new Thread(new Runnable() {
456 public void run() {
457 try {
458 threadAssertFalse(lock.readLock().tryLock(1, TimeUnit.MILLISECONDS));
459 } catch (Exception ex) {
460 threadUnexpectedException();
461 }
462 }
463 });
464 try {
465 t.start();
466 t.join();
467 lock.writeLock().unlock();
468 } catch(Exception e){
469 unexpectedException();
470 }
471 }
472
473
474 /**
475 * write lockInterruptibly succeeds if lock free else is interruptible
476 */
477 public void testWriteLockInterruptibly() {
478 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
479 try {
480 lock.writeLock().lockInterruptibly();
481 } catch(Exception e) {
482 unexpectedException();
483 }
484 Thread t = new Thread(new Runnable() {
485 public void run() {
486 try {
487 lock.writeLock().lockInterruptibly();
488 threadShouldThrow();
489 }
490 catch(InterruptedException success) {
491 }
492 }
493 });
494 try {
495 t.start();
496 t.interrupt();
497 t.join();
498 lock.writeLock().unlock();
499 } catch(Exception e){
500 unexpectedException();
501 }
502 }
503
504 /**
505 * read lockInterruptibly succeeds if lock free else is interruptible
506 */
507 public void testReadLockInterruptibly() {
508 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
509 try {
510 lock.writeLock().lockInterruptibly();
511 } catch(Exception e) {
512 unexpectedException();
513 }
514 Thread t = new Thread(new Runnable() {
515 public void run() {
516 try {
517 lock.readLock().lockInterruptibly();
518 threadShouldThrow();
519 }
520 catch(InterruptedException success) {
521 }
522 }
523 });
524 try {
525 t.start();
526 t.interrupt();
527 t.join();
528 lock.writeLock().unlock();
529 } catch(Exception e){
530 unexpectedException();
531 }
532 }
533
534 /**
535 * Calling await without holding lock throws IllegalMonitorStateException
536 */
537 public void testAwait_IllegalMonitor() {
538 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
539 final Condition c = lock.writeLock().newCondition();
540 try {
541 c.await();
542 shouldThrow();
543 }
544 catch (IllegalMonitorStateException success) {
545 }
546 catch (Exception ex) {
547 shouldThrow();
548 }
549 }
550
551 /**
552 * Calling signal without holding lock throws IllegalMonitorStateException
553 */
554 public void testSignal_IllegalMonitor() {
555 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
556 final Condition c = lock.writeLock().newCondition();
557 try {
558 c.signal();
559 shouldThrow();
560 }
561 catch (IllegalMonitorStateException success) {
562 }
563 catch (Exception ex) {
564 unexpectedException();
565 }
566 }
567
568 /**
569 * awaitNanos without a signal times out
570 */
571 public void testAwaitNanos_Timeout() {
572 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
573 final Condition c = lock.writeLock().newCondition();
574 try {
575 lock.writeLock().lock();
576 long t = c.awaitNanos(100);
577 assertTrue(t <= 0);
578 lock.writeLock().unlock();
579 }
580 catch (Exception ex) {
581 unexpectedException();
582 }
583 }
584
585
586 /**
587 * timed await without a signal times out
588 */
589 public void testAwait_Timeout() {
590 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
591 final Condition c = lock.writeLock().newCondition();
592 try {
593 lock.writeLock().lock();
594 assertFalse(c.await(10, TimeUnit.MILLISECONDS));
595 lock.writeLock().unlock();
596 }
597 catch (Exception ex) {
598 unexpectedException();
599 }
600 }
601
602 /**
603 * awaitUntil without a signal times out
604 */
605 public void testAwaitUntil_Timeout() {
606 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
607 final Condition c = lock.writeLock().newCondition();
608 try {
609 lock.writeLock().lock();
610 java.util.Date d = new java.util.Date();
611 assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
612 lock.writeLock().unlock();
613 }
614 catch (Exception ex) {
615 unexpectedException();
616 }
617 }
618
619 /**
620 * await returns when signalled
621 */
622 public void testAwait() {
623 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
624 final Condition c = lock.writeLock().newCondition();
625 Thread t = new Thread(new Runnable() {
626 public void run() {
627 try {
628 lock.writeLock().lock();
629 c.await();
630 lock.writeLock().unlock();
631 }
632 catch(InterruptedException e) {
633 threadUnexpectedException();
634 }
635 }
636 });
637
638 try {
639 t.start();
640 Thread.sleep(SHORT_DELAY_MS);
641 lock.writeLock().lock();
642 c.signal();
643 lock.writeLock().unlock();
644 t.join(SHORT_DELAY_MS);
645 assertFalse(t.isAlive());
646 }
647 catch (Exception ex) {
648 unexpectedException();
649 }
650 }
651
652 /**
653 * awaitUninterruptibly doesn't abort on interrupt
654 */
655 public void testAwaitUninterruptibly() {
656 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
657 final Condition c = lock.writeLock().newCondition();
658 Thread t = new Thread(new Runnable() {
659 public void run() {
660 lock.writeLock().lock();
661 c.awaitUninterruptibly();
662 lock.writeLock().unlock();
663 }
664 });
665
666 try {
667 t.start();
668 Thread.sleep(SHORT_DELAY_MS);
669 t.interrupt();
670 lock.writeLock().lock();
671 c.signal();
672 lock.writeLock().unlock();
673 assert(t.isInterrupted());
674 t.join(SHORT_DELAY_MS);
675 assertFalse(t.isAlive());
676 }
677 catch (Exception ex) {
678 unexpectedException();
679 }
680 }
681
682 /**
683 * await is interruptible
684 */
685 public void testAwait_Interrupt() {
686 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
687 final Condition c = lock.writeLock().newCondition();
688 Thread t = new Thread(new Runnable() {
689 public void run() {
690 try {
691 lock.writeLock().lock();
692 c.await();
693 lock.writeLock().unlock();
694 threadShouldThrow();
695 }
696 catch(InterruptedException success) {
697 }
698 }
699 });
700
701 try {
702 t.start();
703 Thread.sleep(SHORT_DELAY_MS);
704 t.interrupt();
705 t.join(SHORT_DELAY_MS);
706 assertFalse(t.isAlive());
707 }
708 catch (Exception ex) {
709 unexpectedException();
710 }
711 }
712
713 /**
714 * awaitNanos is interruptible
715 */
716 public void testAwaitNanos_Interrupt() {
717 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
718 final Condition c = lock.writeLock().newCondition();
719 Thread t = new Thread(new Runnable() {
720 public void run() {
721 try {
722 lock.writeLock().lock();
723 c.awaitNanos(SHORT_DELAY_MS * 2 * 1000000);
724 lock.writeLock().unlock();
725 threadShouldThrow();
726 }
727 catch(InterruptedException success) {
728 }
729 }
730 });
731
732 try {
733 t.start();
734 Thread.sleep(SHORT_DELAY_MS);
735 t.interrupt();
736 t.join(SHORT_DELAY_MS);
737 assertFalse(t.isAlive());
738 }
739 catch (Exception ex) {
740 unexpectedException();
741 }
742 }
743
744 /**
745 * awaitUntil is interruptible
746 */
747 public void testAwaitUntil_Interrupt() {
748 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
749 final Condition c = lock.writeLock().newCondition();
750 Thread t = new Thread(new Runnable() {
751 public void run() {
752 try {
753 lock.writeLock().lock();
754 java.util.Date d = new java.util.Date();
755 c.awaitUntil(new java.util.Date(d.getTime() + 10000));
756 lock.writeLock().unlock();
757 threadShouldThrow();
758 }
759 catch(InterruptedException success) {
760 }
761 }
762 });
763
764 try {
765 t.start();
766 Thread.sleep(SHORT_DELAY_MS);
767 t.interrupt();
768 t.join(SHORT_DELAY_MS);
769 assertFalse(t.isAlive());
770 }
771 catch (Exception ex) {
772 unexpectedException();
773 }
774 }
775
776 /**
777 * signalAll wakes up all threads
778 */
779 public void testSignalAll() {
780 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
781 final Condition c = lock.writeLock().newCondition();
782 Thread t1 = new Thread(new Runnable() {
783 public void run() {
784 try {
785 lock.writeLock().lock();
786 c.await();
787 lock.writeLock().unlock();
788 }
789 catch(InterruptedException e) {
790 threadUnexpectedException();
791 }
792 }
793 });
794
795 Thread t2 = new Thread(new Runnable() {
796 public void run() {
797 try {
798 lock.writeLock().lock();
799 c.await();
800 lock.writeLock().unlock();
801 }
802 catch(InterruptedException e) {
803 threadUnexpectedException();
804 }
805 }
806 });
807
808 try {
809 t1.start();
810 t2.start();
811 Thread.sleep(SHORT_DELAY_MS);
812 lock.writeLock().lock();
813 c.signalAll();
814 lock.writeLock().unlock();
815 t1.join(SHORT_DELAY_MS);
816 t2.join(SHORT_DELAY_MS);
817 assertFalse(t1.isAlive());
818 assertFalse(t2.isAlive());
819 }
820 catch (Exception ex) {
821 unexpectedException();
822 }
823 }
824
825 /**
826 * A serialized lock deserializes as unlocked
827 */
828 public void testSerialization() {
829 ReentrantReadWriteLock l = new ReentrantReadWriteLock();
830 l.readLock().lock();
831 l.readLock().unlock();
832
833 try {
834 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
835 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
836 out.writeObject(l);
837 out.close();
838
839 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
840 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
841 ReentrantReadWriteLock r = (ReentrantReadWriteLock) in.readObject();
842 r.readLock().lock();
843 r.readLock().unlock();
844 } catch(Exception e){
845 e.printStackTrace();
846 unexpectedException();
847 }
848 }
849
850 /**
851 * hasQueuedThreads reports whether there are waiting threads
852 */
853 public void testhasQueuedThreads() {
854 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
855 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
856 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
857 try {
858 assertFalse(lock.hasQueuedThreads());
859 lock.writeLock().lock();
860 t1.start();
861 Thread.sleep(SHORT_DELAY_MS);
862 assertTrue(lock.hasQueuedThreads());
863 t2.start();
864 Thread.sleep(SHORT_DELAY_MS);
865 assertTrue(lock.hasQueuedThreads());
866 t1.interrupt();
867 Thread.sleep(SHORT_DELAY_MS);
868 assertTrue(lock.hasQueuedThreads());
869 lock.writeLock().unlock();
870 Thread.sleep(SHORT_DELAY_MS);
871 assertFalse(lock.hasQueuedThreads());
872 t1.join();
873 t2.join();
874 } catch(Exception e){
875 unexpectedException();
876 }
877 }
878
879 /**
880 * getQueueLength reports number of waiting threads
881 */
882 public void testGetQueueLength() {
883 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
884 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
885 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
886 try {
887 assertEquals(0, lock.getQueueLength());
888 lock.writeLock().lock();
889 t1.start();
890 Thread.sleep(SHORT_DELAY_MS);
891 assertEquals(1, lock.getQueueLength());
892 t2.start();
893 Thread.sleep(SHORT_DELAY_MS);
894 assertEquals(2, lock.getQueueLength());
895 t1.interrupt();
896 Thread.sleep(SHORT_DELAY_MS);
897 assertEquals(1, lock.getQueueLength());
898 lock.writeLock().unlock();
899 Thread.sleep(SHORT_DELAY_MS);
900 assertEquals(0, lock.getQueueLength());
901 t1.join();
902 t2.join();
903 } catch(Exception e){
904 unexpectedException();
905 }
906 }
907
908 /**
909 * getQueuedThreads includes waiting threads
910 */
911 public void testGetQueuedThreads() {
912 final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
913 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
914 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
915 try {
916 assertTrue(lock.getQueuedThreads().isEmpty());
917 lock.writeLock().lock();
918 assertTrue(lock.getQueuedThreads().isEmpty());
919 t1.start();
920 Thread.sleep(SHORT_DELAY_MS);
921 assertTrue(lock.getQueuedThreads().contains(t1));
922 t2.start();
923 Thread.sleep(SHORT_DELAY_MS);
924 assertTrue(lock.getQueuedThreads().contains(t1));
925 assertTrue(lock.getQueuedThreads().contains(t2));
926 t1.interrupt();
927 Thread.sleep(SHORT_DELAY_MS);
928 assertFalse(lock.getQueuedThreads().contains(t1));
929 assertTrue(lock.getQueuedThreads().contains(t2));
930 lock.writeLock().unlock();
931 Thread.sleep(SHORT_DELAY_MS);
932 assertTrue(lock.getQueuedThreads().isEmpty());
933 t1.join();
934 t2.join();
935 } catch(Exception e){
936 unexpectedException();
937 }
938 }
939
940 /**
941 * hasWaiters throws IAE if not owned
942 */
943 public void testHasWaitersIAE() {
944 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
945 final Condition c = (lock.writeLock().newCondition());
946 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
947 try {
948 lock2.hasWaiters(c);
949 shouldThrow();
950 } catch (IllegalArgumentException success) {
951 } catch (Exception ex) {
952 unexpectedException();
953 }
954 }
955
956 /**
957 * hasWaiters throws IMSE if not locked
958 */
959 public void testHasWaitersIMSE() {
960 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
961 final Condition c = (lock.writeLock().newCondition());
962 try {
963 lock.hasWaiters(c);
964 shouldThrow();
965 } catch (IllegalMonitorStateException success) {
966 } catch (Exception ex) {
967 unexpectedException();
968 }
969 }
970
971
972 /**
973 * getWaitQueueLength throws IAE if not owned
974 */
975 public void testGetWaitQueueLengthIAE() {
976 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
977 final Condition c = (lock.writeLock().newCondition());
978 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
979 try {
980 lock2.getWaitQueueLength(c);
981 shouldThrow();
982 } catch (IllegalArgumentException success) {
983 } catch (Exception ex) {
984 unexpectedException();
985 }
986 }
987
988 /**
989 * getWaitQueueLength throws IMSE if not locked
990 */
991 public void testGetWaitQueueLengthIMSE() {
992 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
993 final Condition c = (lock.writeLock().newCondition());
994 try {
995 lock.getWaitQueueLength(c);
996 shouldThrow();
997 } catch (IllegalMonitorStateException success) {
998 } catch (Exception ex) {
999 unexpectedException();
1000 }
1001 }
1002
1003
1004 /**
1005 * getWaitingThreads throws IAE if not owned
1006 */
1007 public void testGetWaitingThreadsIAE() {
1008 final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1009 final Condition c = (lock.writeLock().newCondition());
1010 final PublicReentrantReadWriteLock lock2 = new PublicReentrantReadWriteLock();
1011 try {
1012 lock2.getWaitingThreads(c);
1013 shouldThrow();
1014 } catch (IllegalArgumentException success) {
1015 } catch (Exception ex) {
1016 unexpectedException();
1017 }
1018 }
1019
1020 /**
1021 * getWaitingThreads throws IMSE if not locked
1022 */
1023 public void testGetWaitingThreadsIMSE() {
1024 final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1025 final Condition c = (lock.writeLock().newCondition());
1026 try {
1027 lock.getWaitingThreads(c);
1028 shouldThrow();
1029 } catch (IllegalMonitorStateException success) {
1030 } catch (Exception ex) {
1031 unexpectedException();
1032 }
1033 }
1034
1035
1036 /**
1037 * hasWaiters returns true when a thread is waiting, else false
1038 */
1039 public void testHasWaiters() {
1040 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1041 final Condition c = (lock.writeLock().newCondition());
1042 Thread t = new Thread(new Runnable() {
1043 public void run() {
1044 try {
1045 lock.writeLock().lock();
1046 threadAssertFalse(lock.hasWaiters(c));
1047 threadAssertEquals(0, lock.getWaitQueueLength(c));
1048 c.await();
1049 lock.writeLock().unlock();
1050 }
1051 catch(InterruptedException e) {
1052 threadUnexpectedException();
1053 }
1054 }
1055 });
1056
1057 try {
1058 t.start();
1059 Thread.sleep(SHORT_DELAY_MS);
1060 lock.writeLock().lock();
1061 assertTrue(lock.hasWaiters(c));
1062 assertEquals(1, lock.getWaitQueueLength(c));
1063 c.signal();
1064 lock.writeLock().unlock();
1065 Thread.sleep(SHORT_DELAY_MS);
1066 lock.writeLock().lock();
1067 assertFalse(lock.hasWaiters(c));
1068 assertEquals(0, lock.getWaitQueueLength(c));
1069 lock.writeLock().unlock();
1070 t.join(SHORT_DELAY_MS);
1071 assertFalse(t.isAlive());
1072 }
1073 catch (Exception ex) {
1074 unexpectedException();
1075 }
1076 }
1077
1078 /**
1079 * getWaitQueueLength returns number of waiting threads
1080 */
1081 public void testGetWaitQueueLength() {
1082 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1083 final Condition c = (lock.writeLock().newCondition());
1084 Thread t = new Thread(new Runnable() {
1085 public void run() {
1086 try {
1087 lock.writeLock().lock();
1088 threadAssertFalse(lock.hasWaiters(c));
1089 threadAssertEquals(0, lock.getWaitQueueLength(c));
1090 c.await();
1091 lock.writeLock().unlock();
1092 }
1093 catch(InterruptedException e) {
1094 threadUnexpectedException();
1095 }
1096 }
1097 });
1098
1099 try {
1100 t.start();
1101 Thread.sleep(SHORT_DELAY_MS);
1102 lock.writeLock().lock();
1103 assertTrue(lock.hasWaiters(c));
1104 assertEquals(1, lock.getWaitQueueLength(c));
1105 c.signal();
1106 lock.writeLock().unlock();
1107 Thread.sleep(SHORT_DELAY_MS);
1108 lock.writeLock().lock();
1109 assertFalse(lock.hasWaiters(c));
1110 assertEquals(0, lock.getWaitQueueLength(c));
1111 lock.writeLock().unlock();
1112 t.join(SHORT_DELAY_MS);
1113 assertFalse(t.isAlive());
1114 }
1115 catch (Exception ex) {
1116 unexpectedException();
1117 }
1118 }
1119
1120
1121 /**
1122 * getWaitingThreads returns only and all waiting threads
1123 */
1124 public void testGetWaitingThreads() {
1125 final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1126 final Condition c = lock.writeLock().newCondition();
1127 Thread t1 = new Thread(new Runnable() {
1128 public void run() {
1129 try {
1130 lock.writeLock().lock();
1131 threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
1132 c.await();
1133 lock.writeLock().unlock();
1134 }
1135 catch(InterruptedException e) {
1136 threadUnexpectedException();
1137 }
1138 }
1139 });
1140
1141 Thread t2 = new Thread(new Runnable() {
1142 public void run() {
1143 try {
1144 lock.writeLock().lock();
1145 threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
1146 c.await();
1147 lock.writeLock().unlock();
1148 }
1149 catch(InterruptedException e) {
1150 threadUnexpectedException();
1151 }
1152 }
1153 });
1154
1155 try {
1156 lock.writeLock().lock();
1157 assertTrue(lock.getWaitingThreads(c).isEmpty());
1158 lock.writeLock().unlock();
1159 t1.start();
1160 Thread.sleep(SHORT_DELAY_MS);
1161 t2.start();
1162 Thread.sleep(SHORT_DELAY_MS);
1163 lock.writeLock().lock();
1164 assertTrue(lock.hasWaiters(c));
1165 assertTrue(lock.getWaitingThreads(c).contains(t1));
1166 assertTrue(lock.getWaitingThreads(c).contains(t2));
1167 c.signalAll();
1168 lock.writeLock().unlock();
1169 Thread.sleep(SHORT_DELAY_MS);
1170 lock.writeLock().lock();
1171 assertFalse(lock.hasWaiters(c));
1172 assertTrue(lock.getWaitingThreads(c).isEmpty());
1173 lock.writeLock().unlock();
1174 t1.join(SHORT_DELAY_MS);
1175 t2.join(SHORT_DELAY_MS);
1176 assertFalse(t1.isAlive());
1177 assertFalse(t2.isAlive());
1178 }
1179 catch (Exception ex) {
1180 unexpectedException();
1181 }
1182 }
1183
1184 }