ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.53
Committed: Mon May 2 00:49:26 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.52: +47 -71 lines
Log Message:
replace Thread.join with awaitTermination(Thread,long)

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