ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.71
Committed: Fri Feb 27 21:43:18 2015 UTC (9 years, 2 months ago) by jsr166
Branch: MAIN
Changes since 1.70: +2 -6 lines
Log Message:
StampedLockTest.java

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 static java.util.concurrent.TimeUnit.MILLISECONDS;
10
11 import java.util.Arrays;
12 import java.util.Collection;
13 import java.util.HashSet;
14 import java.util.concurrent.CountDownLatch;
15 import java.util.concurrent.atomic.AtomicBoolean;
16 import java.util.concurrent.locks.Condition;
17 import java.util.concurrent.locks.Lock;
18 import java.util.concurrent.locks.ReentrantReadWriteLock;
19
20 import junit.framework.AssertionFailedError;
21 import junit.framework.Test;
22 import junit.framework.TestSuite;
23
24 public class ReentrantReadWriteLockTest extends JSR166TestCase {
25 public static void main(String[] args) {
26 junit.textui.TestRunner.run(suite());
27 }
28 public static Test suite() {
29 return new TestSuite(ReentrantReadWriteLockTest.class);
30 }
31
32 /**
33 * A runnable calling lockInterruptibly
34 */
35 class InterruptibleLockRunnable extends CheckedRunnable {
36 final ReentrantReadWriteLock lock;
37 InterruptibleLockRunnable(ReentrantReadWriteLock l) { lock = l; }
38 public void realRun() throws InterruptedException {
39 lock.writeLock().lockInterruptibly();
40 }
41 }
42
43 /**
44 * A runnable calling lockInterruptibly that expects to be
45 * interrupted
46 */
47 class InterruptedLockRunnable extends CheckedInterruptedRunnable {
48 final ReentrantReadWriteLock lock;
49 InterruptedLockRunnable(ReentrantReadWriteLock l) { lock = l; }
50 public void realRun() throws InterruptedException {
51 lock.writeLock().lockInterruptibly();
52 }
53 }
54
55 /**
56 * Subclass to expose protected methods
57 */
58 static class PublicReentrantReadWriteLock extends ReentrantReadWriteLock {
59 PublicReentrantReadWriteLock() { super(); }
60 PublicReentrantReadWriteLock(boolean fair) { super(fair); }
61 public Thread getOwner() {
62 return super.getOwner();
63 }
64 public Collection<Thread> getQueuedThreads() {
65 return super.getQueuedThreads();
66 }
67 public Collection<Thread> getWaitingThreads(Condition c) {
68 return super.getWaitingThreads(c);
69 }
70 }
71
72 /**
73 * Releases write lock, checking that it had a hold count of 1.
74 */
75 void releaseWriteLock(PublicReentrantReadWriteLock lock) {
76 ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
77 assertWriteLockedByMoi(lock);
78 assertEquals(1, lock.getWriteHoldCount());
79 writeLock.unlock();
80 assertNotWriteLocked(lock);
81 }
82
83 /**
84 * Spin-waits until lock.hasQueuedThread(t) becomes true.
85 */
86 void waitForQueuedThread(PublicReentrantReadWriteLock lock, Thread t) {
87 long startTime = System.nanoTime();
88 while (!lock.hasQueuedThread(t)) {
89 if (millisElapsedSince(startTime) > LONG_DELAY_MS)
90 throw new AssertionFailedError("timed out");
91 Thread.yield();
92 }
93 assertTrue(t.isAlive());
94 assertNotSame(t, lock.getOwner());
95 }
96
97 /**
98 * Checks that lock is not write-locked.
99 */
100 void assertNotWriteLocked(PublicReentrantReadWriteLock lock) {
101 assertFalse(lock.isWriteLocked());
102 assertFalse(lock.isWriteLockedByCurrentThread());
103 assertFalse(lock.writeLock().isHeldByCurrentThread());
104 assertEquals(0, lock.getWriteHoldCount());
105 assertEquals(0, lock.writeLock().getHoldCount());
106 assertNull(lock.getOwner());
107 }
108
109 /**
110 * Checks that lock is write-locked by the given thread.
111 */
112 void assertWriteLockedBy(PublicReentrantReadWriteLock lock, Thread t) {
113 assertTrue(lock.isWriteLocked());
114 assertSame(t, lock.getOwner());
115 assertEquals(t == Thread.currentThread(),
116 lock.isWriteLockedByCurrentThread());
117 assertEquals(t == Thread.currentThread(),
118 lock.writeLock().isHeldByCurrentThread());
119 assertEquals(t == Thread.currentThread(),
120 lock.getWriteHoldCount() > 0);
121 assertEquals(t == Thread.currentThread(),
122 lock.writeLock().getHoldCount() > 0);
123 assertEquals(0, lock.getReadLockCount());
124 }
125
126 /**
127 * Checks that lock is write-locked by the current thread.
128 */
129 void assertWriteLockedByMoi(PublicReentrantReadWriteLock lock) {
130 assertWriteLockedBy(lock, Thread.currentThread());
131 }
132
133 /**
134 * Checks that condition c has no waiters.
135 */
136 void assertHasNoWaiters(PublicReentrantReadWriteLock lock, Condition c) {
137 assertHasWaiters(lock, c, new Thread[] {});
138 }
139
140 /**
141 * Checks that condition c has exactly the given waiter threads.
142 */
143 void assertHasWaiters(PublicReentrantReadWriteLock lock, Condition c,
144 Thread... threads) {
145 lock.writeLock().lock();
146 assertEquals(threads.length > 0, lock.hasWaiters(c));
147 assertEquals(threads.length, lock.getWaitQueueLength(c));
148 assertEquals(threads.length == 0, lock.getWaitingThreads(c).isEmpty());
149 assertEquals(threads.length, lock.getWaitingThreads(c).size());
150 assertEquals(new HashSet<Thread>(lock.getWaitingThreads(c)),
151 new HashSet<Thread>(Arrays.asList(threads)));
152 lock.writeLock().unlock();
153 }
154
155 enum AwaitMethod { await, awaitTimed, awaitNanos, awaitUntil }
156
157 /**
158 * Awaits condition using the specified AwaitMethod.
159 */
160 void await(Condition c, AwaitMethod awaitMethod)
161 throws InterruptedException {
162 switch (awaitMethod) {
163 case await:
164 c.await();
165 break;
166 case awaitTimed:
167 assertTrue(c.await(2 * LONG_DELAY_MS, MILLISECONDS));
168 break;
169 case awaitNanos:
170 long nanosRemaining = c.awaitNanos(MILLISECONDS.toNanos(2 * LONG_DELAY_MS));
171 assertTrue(nanosRemaining > 0);
172 break;
173 case awaitUntil:
174 java.util.Date d = new java.util.Date();
175 assertTrue(c.awaitUntil(new java.util.Date(d.getTime() + 2 * LONG_DELAY_MS)));
176 break;
177 default:
178 throw new AssertionError();
179 }
180 }
181
182 /**
183 * Constructor sets given fairness, and is in unlocked state
184 */
185 public void testConstructor() {
186 PublicReentrantReadWriteLock lock;
187
188 lock = new PublicReentrantReadWriteLock();
189 assertFalse(lock.isFair());
190 assertNotWriteLocked(lock);
191 assertEquals(0, lock.getReadLockCount());
192
193 lock = new PublicReentrantReadWriteLock(true);
194 assertTrue(lock.isFair());
195 assertNotWriteLocked(lock);
196 assertEquals(0, lock.getReadLockCount());
197
198 lock = new PublicReentrantReadWriteLock(false);
199 assertFalse(lock.isFair());
200 assertNotWriteLocked(lock);
201 assertEquals(0, lock.getReadLockCount());
202 }
203
204 /**
205 * write-locking and read-locking an unlocked lock succeed
206 */
207 public void testLock() { testLock(false); }
208 public void testLock_fair() { testLock(true); }
209 public void testLock(boolean fair) {
210 PublicReentrantReadWriteLock lock =
211 new PublicReentrantReadWriteLock(fair);
212 assertNotWriteLocked(lock);
213 lock.writeLock().lock();
214 assertWriteLockedByMoi(lock);
215 lock.writeLock().unlock();
216 assertNotWriteLocked(lock);
217 assertEquals(0, lock.getReadLockCount());
218 lock.readLock().lock();
219 assertNotWriteLocked(lock);
220 assertEquals(1, lock.getReadLockCount());
221 lock.readLock().unlock();
222 assertNotWriteLocked(lock);
223 assertEquals(0, lock.getReadLockCount());
224 }
225
226 /**
227 * getWriteHoldCount returns number of recursive holds
228 */
229 public void testGetWriteHoldCount() { testGetWriteHoldCount(false); }
230 public void testGetWriteHoldCount_fair() { testGetWriteHoldCount(true); }
231 public void testGetWriteHoldCount(boolean fair) {
232 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
233 for (int i = 1; i <= SIZE; i++) {
234 lock.writeLock().lock();
235 assertEquals(i,lock.getWriteHoldCount());
236 }
237 for (int i = SIZE; i > 0; i--) {
238 lock.writeLock().unlock();
239 assertEquals(i-1,lock.getWriteHoldCount());
240 }
241 }
242
243 /**
244 * writelock.getHoldCount returns number of recursive holds
245 */
246 public void testGetHoldCount() { testGetHoldCount(false); }
247 public void testGetHoldCount_fair() { testGetHoldCount(true); }
248 public void testGetHoldCount(boolean fair) {
249 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
250 for (int i = 1; i <= SIZE; i++) {
251 lock.writeLock().lock();
252 assertEquals(i,lock.writeLock().getHoldCount());
253 }
254 for (int i = SIZE; i > 0; i--) {
255 lock.writeLock().unlock();
256 assertEquals(i-1,lock.writeLock().getHoldCount());
257 }
258 }
259
260 /**
261 * getReadHoldCount returns number of recursive holds
262 */
263 public void testGetReadHoldCount() { testGetReadHoldCount(false); }
264 public void testGetReadHoldCount_fair() { testGetReadHoldCount(true); }
265 public void testGetReadHoldCount(boolean fair) {
266 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
267 for (int i = 1; i <= SIZE; i++) {
268 lock.readLock().lock();
269 assertEquals(i,lock.getReadHoldCount());
270 }
271 for (int i = SIZE; i > 0; i--) {
272 lock.readLock().unlock();
273 assertEquals(i-1,lock.getReadHoldCount());
274 }
275 }
276
277 /**
278 * write-unlocking an unlocked lock throws IllegalMonitorStateException
279 */
280 public void testWriteUnlock_IMSE() { testWriteUnlock_IMSE(false); }
281 public void testWriteUnlock_IMSE_fair() { testWriteUnlock_IMSE(true); }
282 public void testWriteUnlock_IMSE(boolean fair) {
283 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
284 try {
285 lock.writeLock().unlock();
286 shouldThrow();
287 } catch (IllegalMonitorStateException success) {}
288 }
289
290 /**
291 * read-unlocking an unlocked lock throws IllegalMonitorStateException
292 */
293 public void testReadUnlock_IMSE() { testReadUnlock_IMSE(false); }
294 public void testReadUnlock_IMSE_fair() { testReadUnlock_IMSE(true); }
295 public void testReadUnlock_IMSE(boolean fair) {
296 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
297 try {
298 lock.readLock().unlock();
299 shouldThrow();
300 } catch (IllegalMonitorStateException success) {}
301 }
302
303 /**
304 * write-lockInterruptibly is interruptible
305 */
306 public void testWriteLockInterruptibly_Interruptible() { testWriteLockInterruptibly_Interruptible(false); }
307 public void testWriteLockInterruptibly_Interruptible_fair() { testWriteLockInterruptibly_Interruptible(true); }
308 public void testWriteLockInterruptibly_Interruptible(boolean fair) {
309 final PublicReentrantReadWriteLock lock =
310 new PublicReentrantReadWriteLock(fair);
311 lock.writeLock().lock();
312 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
313 public void realRun() throws InterruptedException {
314 lock.writeLock().lockInterruptibly();
315 }});
316
317 waitForQueuedThread(lock, t);
318 t.interrupt();
319 awaitTermination(t);
320 releaseWriteLock(lock);
321 }
322
323 /**
324 * timed write-tryLock is interruptible
325 */
326 public void testWriteTryLock_Interruptible() { testWriteTryLock_Interruptible(false); }
327 public void testWriteTryLock_Interruptible_fair() { testWriteTryLock_Interruptible(true); }
328 public void testWriteTryLock_Interruptible(boolean fair) {
329 final PublicReentrantReadWriteLock lock =
330 new PublicReentrantReadWriteLock(fair);
331 lock.writeLock().lock();
332 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
333 public void realRun() throws InterruptedException {
334 lock.writeLock().tryLock(2 * LONG_DELAY_MS, MILLISECONDS);
335 }});
336
337 waitForQueuedThread(lock, t);
338 t.interrupt();
339 awaitTermination(t);
340 releaseWriteLock(lock);
341 }
342
343 /**
344 * read-lockInterruptibly is interruptible
345 */
346 public void testReadLockInterruptibly_Interruptible() { testReadLockInterruptibly_Interruptible(false); }
347 public void testReadLockInterruptibly_Interruptible_fair() { testReadLockInterruptibly_Interruptible(true); }
348 public void testReadLockInterruptibly_Interruptible(boolean fair) {
349 final PublicReentrantReadWriteLock lock =
350 new PublicReentrantReadWriteLock(fair);
351 lock.writeLock().lock();
352 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
353 public void realRun() throws InterruptedException {
354 lock.readLock().lockInterruptibly();
355 }});
356
357 waitForQueuedThread(lock, t);
358 t.interrupt();
359 awaitTermination(t);
360 releaseWriteLock(lock);
361 }
362
363 /**
364 * timed read-tryLock is interruptible
365 */
366 public void testReadTryLock_Interruptible() { testReadTryLock_Interruptible(false); }
367 public void testReadTryLock_Interruptible_fair() { testReadTryLock_Interruptible(true); }
368 public void testReadTryLock_Interruptible(boolean fair) {
369 final PublicReentrantReadWriteLock lock =
370 new PublicReentrantReadWriteLock(fair);
371 lock.writeLock().lock();
372 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
373 public void realRun() throws InterruptedException {
374 lock.readLock().tryLock(2 * LONG_DELAY_MS, MILLISECONDS);
375 }});
376
377 waitForQueuedThread(lock, t);
378 t.interrupt();
379 awaitTermination(t);
380 releaseWriteLock(lock);
381 }
382
383 /**
384 * write-tryLock on an unlocked lock succeeds
385 */
386 public void testWriteTryLock() { testWriteTryLock(false); }
387 public void testWriteTryLock_fair() { testWriteTryLock(true); }
388 public void testWriteTryLock(boolean fair) {
389 final PublicReentrantReadWriteLock lock =
390 new PublicReentrantReadWriteLock(fair);
391 assertTrue(lock.writeLock().tryLock());
392 assertWriteLockedByMoi(lock);
393 assertTrue(lock.writeLock().tryLock());
394 assertWriteLockedByMoi(lock);
395 lock.writeLock().unlock();
396 releaseWriteLock(lock);
397 }
398
399 /**
400 * write-tryLock fails if locked
401 */
402 public void testWriteTryLockWhenLocked() { testWriteTryLockWhenLocked(false); }
403 public void testWriteTryLockWhenLocked_fair() { testWriteTryLockWhenLocked(true); }
404 public void testWriteTryLockWhenLocked(boolean fair) {
405 final PublicReentrantReadWriteLock lock =
406 new PublicReentrantReadWriteLock(fair);
407 lock.writeLock().lock();
408 Thread t = newStartedThread(new CheckedRunnable() {
409 public void realRun() {
410 assertFalse(lock.writeLock().tryLock());
411 }});
412
413 awaitTermination(t);
414 releaseWriteLock(lock);
415 }
416
417 /**
418 * read-tryLock fails if locked
419 */
420 public void testReadTryLockWhenLocked() { testReadTryLockWhenLocked(false); }
421 public void testReadTryLockWhenLocked_fair() { testReadTryLockWhenLocked(true); }
422 public void testReadTryLockWhenLocked(boolean fair) {
423 final PublicReentrantReadWriteLock lock =
424 new PublicReentrantReadWriteLock(fair);
425 lock.writeLock().lock();
426 Thread t = newStartedThread(new CheckedRunnable() {
427 public void realRun() {
428 assertFalse(lock.readLock().tryLock());
429 }});
430
431 awaitTermination(t);
432 releaseWriteLock(lock);
433 }
434
435 /**
436 * Multiple threads can hold a read lock when not write-locked
437 */
438 public void testMultipleReadLocks() { testMultipleReadLocks(false); }
439 public void testMultipleReadLocks_fair() { testMultipleReadLocks(true); }
440 public void testMultipleReadLocks(boolean fair) {
441 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
442 lock.readLock().lock();
443 Thread t = newStartedThread(new CheckedRunnable() {
444 public void realRun() throws InterruptedException {
445 assertTrue(lock.readLock().tryLock());
446 lock.readLock().unlock();
447 assertTrue(lock.readLock().tryLock(LONG_DELAY_MS, MILLISECONDS));
448 lock.readLock().unlock();
449 lock.readLock().lock();
450 lock.readLock().unlock();
451 }});
452
453 awaitTermination(t);
454 lock.readLock().unlock();
455 }
456
457 /**
458 * A writelock succeeds only after a reading thread unlocks
459 */
460 public void testWriteAfterReadLock() { testWriteAfterReadLock(false); }
461 public void testWriteAfterReadLock_fair() { testWriteAfterReadLock(true); }
462 public void testWriteAfterReadLock(boolean fair) {
463 final PublicReentrantReadWriteLock lock =
464 new PublicReentrantReadWriteLock(fair);
465 lock.readLock().lock();
466 Thread t = newStartedThread(new CheckedRunnable() {
467 public void realRun() {
468 assertEquals(1, lock.getReadLockCount());
469 lock.writeLock().lock();
470 assertEquals(0, lock.getReadLockCount());
471 lock.writeLock().unlock();
472 }});
473 waitForQueuedThread(lock, t);
474 assertNotWriteLocked(lock);
475 assertEquals(1, lock.getReadLockCount());
476 lock.readLock().unlock();
477 assertEquals(0, lock.getReadLockCount());
478 awaitTermination(t);
479 assertNotWriteLocked(lock);
480 }
481
482 /**
483 * A writelock succeeds only after reading threads unlock
484 */
485 public void testWriteAfterMultipleReadLocks() { testWriteAfterMultipleReadLocks(false); }
486 public void testWriteAfterMultipleReadLocks_fair() { testWriteAfterMultipleReadLocks(true); }
487 public void testWriteAfterMultipleReadLocks(boolean fair) {
488 final PublicReentrantReadWriteLock lock =
489 new PublicReentrantReadWriteLock(fair);
490 lock.readLock().lock();
491 lock.readLock().lock();
492 Thread t1 = newStartedThread(new CheckedRunnable() {
493 public void realRun() {
494 lock.readLock().lock();
495 assertEquals(3, lock.getReadLockCount());
496 lock.readLock().unlock();
497 }});
498 awaitTermination(t1);
499
500 Thread t2 = newStartedThread(new CheckedRunnable() {
501 public void realRun() {
502 assertEquals(2, lock.getReadLockCount());
503 lock.writeLock().lock();
504 assertEquals(0, lock.getReadLockCount());
505 lock.writeLock().unlock();
506 }});
507 waitForQueuedThread(lock, t2);
508 assertNotWriteLocked(lock);
509 assertEquals(2, lock.getReadLockCount());
510 lock.readLock().unlock();
511 lock.readLock().unlock();
512 assertEquals(0, lock.getReadLockCount());
513 awaitTermination(t2);
514 assertNotWriteLocked(lock);
515 }
516
517 /**
518 * A thread that tries to acquire a fair read lock (non-reentrantly)
519 * will block if there is a waiting writer thread
520 */
521 public void testReaderWriterReaderFairFifo() {
522 final PublicReentrantReadWriteLock lock =
523 new PublicReentrantReadWriteLock(true);
524 final AtomicBoolean t1GotLock = new AtomicBoolean(false);
525
526 lock.readLock().lock();
527 Thread t1 = newStartedThread(new CheckedRunnable() {
528 public void realRun() {
529 assertEquals(1, lock.getReadLockCount());
530 lock.writeLock().lock();
531 assertEquals(0, lock.getReadLockCount());
532 t1GotLock.set(true);
533 lock.writeLock().unlock();
534 }});
535 waitForQueuedThread(lock, t1);
536
537 Thread t2 = newStartedThread(new CheckedRunnable() {
538 public void realRun() {
539 assertEquals(1, lock.getReadLockCount());
540 lock.readLock().lock();
541 assertEquals(1, lock.getReadLockCount());
542 assertTrue(t1GotLock.get());
543 lock.readLock().unlock();
544 }});
545 waitForQueuedThread(lock, t2);
546 assertTrue(t1.isAlive());
547 assertNotWriteLocked(lock);
548 assertEquals(1, lock.getReadLockCount());
549 lock.readLock().unlock();
550 awaitTermination(t1);
551 awaitTermination(t2);
552 assertNotWriteLocked(lock);
553 }
554
555 /**
556 * Readlocks succeed only after a writing thread unlocks
557 */
558 public void testReadAfterWriteLock() { testReadAfterWriteLock(false); }
559 public void testReadAfterWriteLock_fair() { testReadAfterWriteLock(true); }
560 public void testReadAfterWriteLock(boolean fair) {
561 final PublicReentrantReadWriteLock lock =
562 new PublicReentrantReadWriteLock(fair);
563 lock.writeLock().lock();
564 Thread t1 = newStartedThread(new CheckedRunnable() {
565 public void realRun() {
566 lock.readLock().lock();
567 lock.readLock().unlock();
568 }});
569 Thread t2 = newStartedThread(new CheckedRunnable() {
570 public void realRun() {
571 lock.readLock().lock();
572 lock.readLock().unlock();
573 }});
574
575 waitForQueuedThread(lock, t1);
576 waitForQueuedThread(lock, t2);
577 releaseWriteLock(lock);
578 awaitTermination(t1);
579 awaitTermination(t2);
580 }
581
582 /**
583 * Read trylock succeeds if write locked by current thread
584 */
585 public void testReadHoldingWriteLock() { testReadHoldingWriteLock(false); }
586 public void testReadHoldingWriteLock_fair() { testReadHoldingWriteLock(true); }
587 public void testReadHoldingWriteLock(boolean fair) {
588 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
589 lock.writeLock().lock();
590 assertTrue(lock.readLock().tryLock());
591 lock.readLock().unlock();
592 lock.writeLock().unlock();
593 }
594
595 /**
596 * Read trylock succeeds (barging) even in the presence of waiting
597 * readers and/or writers
598 */
599 public void testReadTryLockBarging() { testReadTryLockBarging(false); }
600 public void testReadTryLockBarging_fair() { testReadTryLockBarging(true); }
601 public void testReadTryLockBarging(boolean fair) {
602 final PublicReentrantReadWriteLock lock =
603 new PublicReentrantReadWriteLock(fair);
604 lock.readLock().lock();
605
606 Thread t1 = newStartedThread(new CheckedRunnable() {
607 public void realRun() {
608 lock.writeLock().lock();
609 lock.writeLock().unlock();
610 }});
611
612 waitForQueuedThread(lock, t1);
613
614 Thread t2 = newStartedThread(new CheckedRunnable() {
615 public void realRun() {
616 lock.readLock().lock();
617 lock.readLock().unlock();
618 }});
619
620 if (fair)
621 waitForQueuedThread(lock, t2);
622
623 Thread t3 = newStartedThread(new CheckedRunnable() {
624 public void realRun() {
625 lock.readLock().tryLock();
626 lock.readLock().unlock();
627 }});
628
629 assertTrue(lock.getReadLockCount() > 0);
630 awaitTermination(t3);
631 assertTrue(t1.isAlive());
632 if (fair) assertTrue(t2.isAlive());
633 lock.readLock().unlock();
634 awaitTermination(t1);
635 awaitTermination(t2);
636 }
637
638 /**
639 * Read lock succeeds if write locked by current thread even if
640 * other threads are waiting for readlock
641 */
642 public void testReadHoldingWriteLock2() { testReadHoldingWriteLock2(false); }
643 public void testReadHoldingWriteLock2_fair() { testReadHoldingWriteLock2(true); }
644 public void testReadHoldingWriteLock2(boolean fair) {
645 final PublicReentrantReadWriteLock lock =
646 new PublicReentrantReadWriteLock(fair);
647 lock.writeLock().lock();
648 lock.readLock().lock();
649 lock.readLock().unlock();
650
651 Thread t1 = newStartedThread(new CheckedRunnable() {
652 public void realRun() {
653 lock.readLock().lock();
654 lock.readLock().unlock();
655 }});
656 Thread t2 = newStartedThread(new CheckedRunnable() {
657 public void realRun() {
658 lock.readLock().lock();
659 lock.readLock().unlock();
660 }});
661
662 waitForQueuedThread(lock, t1);
663 waitForQueuedThread(lock, t2);
664 assertWriteLockedByMoi(lock);
665 lock.readLock().lock();
666 lock.readLock().unlock();
667 releaseWriteLock(lock);
668 awaitTermination(t1);
669 awaitTermination(t2);
670 }
671
672 /**
673 * Read lock succeeds if write locked by current thread even if
674 * other threads are waiting for writelock
675 */
676 public void testReadHoldingWriteLock3() { testReadHoldingWriteLock3(false); }
677 public void testReadHoldingWriteLock3_fair() { testReadHoldingWriteLock3(true); }
678 public void testReadHoldingWriteLock3(boolean fair) {
679 final PublicReentrantReadWriteLock lock =
680 new PublicReentrantReadWriteLock(fair);
681 lock.writeLock().lock();
682 lock.readLock().lock();
683 lock.readLock().unlock();
684
685 Thread t1 = newStartedThread(new CheckedRunnable() {
686 public void realRun() {
687 lock.writeLock().lock();
688 lock.writeLock().unlock();
689 }});
690 Thread t2 = newStartedThread(new CheckedRunnable() {
691 public void realRun() {
692 lock.writeLock().lock();
693 lock.writeLock().unlock();
694 }});
695
696 waitForQueuedThread(lock, t1);
697 waitForQueuedThread(lock, t2);
698 assertWriteLockedByMoi(lock);
699 lock.readLock().lock();
700 lock.readLock().unlock();
701 assertWriteLockedByMoi(lock);
702 lock.writeLock().unlock();
703 awaitTermination(t1);
704 awaitTermination(t2);
705 }
706
707 /**
708 * Write lock succeeds if write locked by current thread even if
709 * other threads are waiting for writelock
710 */
711 public void testWriteHoldingWriteLock4() { testWriteHoldingWriteLock4(false); }
712 public void testWriteHoldingWriteLock4_fair() { testWriteHoldingWriteLock4(true); }
713 public void testWriteHoldingWriteLock4(boolean fair) {
714 final PublicReentrantReadWriteLock lock =
715 new PublicReentrantReadWriteLock(fair);
716 lock.writeLock().lock();
717 lock.writeLock().lock();
718 lock.writeLock().unlock();
719
720 Thread t1 = newStartedThread(new CheckedRunnable() {
721 public void realRun() {
722 lock.writeLock().lock();
723 lock.writeLock().unlock();
724 }});
725 Thread t2 = newStartedThread(new CheckedRunnable() {
726 public void realRun() {
727 lock.writeLock().lock();
728 lock.writeLock().unlock();
729 }});
730
731 waitForQueuedThread(lock, t1);
732 waitForQueuedThread(lock, t2);
733 assertWriteLockedByMoi(lock);
734 assertEquals(1, lock.getWriteHoldCount());
735 lock.writeLock().lock();
736 assertWriteLockedByMoi(lock);
737 assertEquals(2, lock.getWriteHoldCount());
738 lock.writeLock().unlock();
739 assertWriteLockedByMoi(lock);
740 assertEquals(1, lock.getWriteHoldCount());
741 lock.writeLock().unlock();
742 awaitTermination(t1);
743 awaitTermination(t2);
744 }
745
746 /**
747 * Read tryLock succeeds if readlocked but not writelocked
748 */
749 public void testTryLockWhenReadLocked() { testTryLockWhenReadLocked(false); }
750 public void testTryLockWhenReadLocked_fair() { testTryLockWhenReadLocked(true); }
751 public void testTryLockWhenReadLocked(boolean fair) {
752 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
753 lock.readLock().lock();
754 Thread t = newStartedThread(new CheckedRunnable() {
755 public void realRun() {
756 assertTrue(lock.readLock().tryLock());
757 lock.readLock().unlock();
758 }});
759
760 awaitTermination(t);
761 lock.readLock().unlock();
762 }
763
764 /**
765 * write tryLock fails when readlocked
766 */
767 public void testWriteTryLockWhenReadLocked() { testWriteTryLockWhenReadLocked(false); }
768 public void testWriteTryLockWhenReadLocked_fair() { testWriteTryLockWhenReadLocked(true); }
769 public void testWriteTryLockWhenReadLocked(boolean fair) {
770 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
771 lock.readLock().lock();
772 Thread t = newStartedThread(new CheckedRunnable() {
773 public void realRun() {
774 assertFalse(lock.writeLock().tryLock());
775 }});
776
777 awaitTermination(t);
778 lock.readLock().unlock();
779 }
780
781 /**
782 * write timed tryLock times out if locked
783 */
784 public void testWriteTryLock_Timeout() { testWriteTryLock_Timeout(false); }
785 public void testWriteTryLock_Timeout_fair() { testWriteTryLock_Timeout(true); }
786 public void testWriteTryLock_Timeout(boolean fair) {
787 final PublicReentrantReadWriteLock lock =
788 new PublicReentrantReadWriteLock(fair);
789 lock.writeLock().lock();
790 Thread t = newStartedThread(new CheckedRunnable() {
791 public void realRun() throws InterruptedException {
792 long startTime = System.nanoTime();
793 long timeoutMillis = 10;
794 assertFalse(lock.writeLock().tryLock(timeoutMillis, MILLISECONDS));
795 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
796 }});
797
798 awaitTermination(t);
799 releaseWriteLock(lock);
800 }
801
802 /**
803 * read timed tryLock times out if write-locked
804 */
805 public void testReadTryLock_Timeout() { testReadTryLock_Timeout(false); }
806 public void testReadTryLock_Timeout_fair() { testReadTryLock_Timeout(true); }
807 public void testReadTryLock_Timeout(boolean fair) {
808 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
809 lock.writeLock().lock();
810 Thread t = newStartedThread(new CheckedRunnable() {
811 public void realRun() throws InterruptedException {
812 long startTime = System.nanoTime();
813 long timeoutMillis = 10;
814 assertFalse(lock.readLock().tryLock(timeoutMillis, MILLISECONDS));
815 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
816 }});
817
818 awaitTermination(t);
819 assertTrue(lock.writeLock().isHeldByCurrentThread());
820 lock.writeLock().unlock();
821 }
822
823 /**
824 * write lockInterruptibly succeeds if unlocked, else is interruptible
825 */
826 public void testWriteLockInterruptibly() { testWriteLockInterruptibly(false); }
827 public void testWriteLockInterruptibly_fair() { testWriteLockInterruptibly(true); }
828 public void testWriteLockInterruptibly(boolean fair) {
829 final PublicReentrantReadWriteLock lock =
830 new PublicReentrantReadWriteLock(fair);
831 try {
832 lock.writeLock().lockInterruptibly();
833 } catch (InterruptedException ie) {
834 threadUnexpectedException(ie);
835 }
836 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
837 public void realRun() throws InterruptedException {
838 lock.writeLock().lockInterruptibly();
839 }});
840
841 waitForQueuedThread(lock, t);
842 t.interrupt();
843 assertTrue(lock.writeLock().isHeldByCurrentThread());
844 awaitTermination(t);
845 releaseWriteLock(lock);
846 }
847
848 /**
849 * read lockInterruptibly succeeds if lock free else is interruptible
850 */
851 public void testReadLockInterruptibly() { testReadLockInterruptibly(false); }
852 public void testReadLockInterruptibly_fair() { testReadLockInterruptibly(true); }
853 public void testReadLockInterruptibly(boolean fair) {
854 final PublicReentrantReadWriteLock lock =
855 new PublicReentrantReadWriteLock(fair);
856 try {
857 lock.readLock().lockInterruptibly();
858 lock.readLock().unlock();
859 lock.writeLock().lockInterruptibly();
860 } catch (InterruptedException ie) {
861 threadUnexpectedException(ie);
862 }
863 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
864 public void realRun() throws InterruptedException {
865 lock.readLock().lockInterruptibly();
866 }});
867
868 waitForQueuedThread(lock, t);
869 t.interrupt();
870 awaitTermination(t);
871 releaseWriteLock(lock);
872 }
873
874 /**
875 * Calling await without holding lock throws IllegalMonitorStateException
876 */
877 public void testAwait_IMSE() { testAwait_IMSE(false); }
878 public void testAwait_IMSE_fair() { testAwait_IMSE(true); }
879 public void testAwait_IMSE(boolean fair) {
880 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
881 final Condition c = lock.writeLock().newCondition();
882 for (AwaitMethod awaitMethod : AwaitMethod.values()) {
883 long startTime = System.nanoTime();
884 try {
885 await(c, awaitMethod);
886 shouldThrow();
887 } catch (IllegalMonitorStateException success) {
888 } catch (InterruptedException e) { threadUnexpectedException(e); }
889 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
890 }
891 }
892
893 /**
894 * Calling signal without holding lock throws IllegalMonitorStateException
895 */
896 public void testSignal_IMSE() { testSignal_IMSE(false); }
897 public void testSignal_IMSE_fair() { testSignal_IMSE(true); }
898 public void testSignal_IMSE(boolean fair) {
899 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
900 final Condition c = lock.writeLock().newCondition();
901 try {
902 c.signal();
903 shouldThrow();
904 } catch (IllegalMonitorStateException success) {}
905 }
906
907 /**
908 * Calling signalAll without holding lock throws IllegalMonitorStateException
909 */
910 public void testSignalAll_IMSE() { testSignalAll_IMSE(false); }
911 public void testSignalAll_IMSE_fair() { testSignalAll_IMSE(true); }
912 public void testSignalAll_IMSE(boolean fair) {
913 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
914 final Condition c = lock.writeLock().newCondition();
915 try {
916 c.signalAll();
917 shouldThrow();
918 } catch (IllegalMonitorStateException success) {}
919 }
920
921 /**
922 * awaitNanos without a signal times out
923 */
924 public void testAwaitNanos_Timeout() { testAwaitNanos_Timeout(false); }
925 public void testAwaitNanos_Timeout_fair() { testAwaitNanos_Timeout(true); }
926 public void testAwaitNanos_Timeout(boolean fair) {
927 try {
928 final ReentrantReadWriteLock lock =
929 new ReentrantReadWriteLock(fair);
930 final Condition c = lock.writeLock().newCondition();
931 lock.writeLock().lock();
932 long startTime = System.nanoTime();
933 long timeoutMillis = 10;
934 long timeoutNanos = MILLISECONDS.toNanos(timeoutMillis);
935 long nanosRemaining = c.awaitNanos(timeoutNanos);
936 assertTrue(nanosRemaining <= 0);
937 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
938 lock.writeLock().unlock();
939 } catch (InterruptedException e) {
940 threadUnexpectedException(e);
941 }
942 }
943
944 /**
945 * timed await without a signal times out
946 */
947 public void testAwait_Timeout() { testAwait_Timeout(false); }
948 public void testAwait_Timeout_fair() { testAwait_Timeout(true); }
949 public void testAwait_Timeout(boolean fair) {
950 try {
951 final ReentrantReadWriteLock lock =
952 new ReentrantReadWriteLock(fair);
953 final Condition c = lock.writeLock().newCondition();
954 lock.writeLock().lock();
955 long startTime = System.nanoTime();
956 long timeoutMillis = 10;
957 assertFalse(c.await(timeoutMillis, MILLISECONDS));
958 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
959 lock.writeLock().unlock();
960 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
961 }
962
963 /**
964 * awaitUntil without a signal times out
965 */
966 public void testAwaitUntil_Timeout() { testAwaitUntil_Timeout(false); }
967 public void testAwaitUntil_Timeout_fair() { testAwaitUntil_Timeout(true); }
968 public void testAwaitUntil_Timeout(boolean fair) {
969 try {
970 final ReentrantReadWriteLock lock =
971 new ReentrantReadWriteLock(fair);
972 final Condition c = lock.writeLock().newCondition();
973 lock.writeLock().lock();
974 long startTime = System.nanoTime();
975 long timeoutMillis = 10;
976 java.util.Date d = new java.util.Date();
977 assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + timeoutMillis)));
978 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
979 lock.writeLock().unlock();
980 } catch (InterruptedException fail) { threadUnexpectedException(fail); }
981 }
982
983 /**
984 * await returns when signalled
985 */
986 public void testAwait() { testAwait(false); }
987 public void testAwait_fair() { testAwait(true); }
988 public void testAwait(boolean fair) {
989 final PublicReentrantReadWriteLock lock =
990 new PublicReentrantReadWriteLock(fair);
991 final Condition c = lock.writeLock().newCondition();
992 final CountDownLatch locked = new CountDownLatch(1);
993 Thread t = newStartedThread(new CheckedRunnable() {
994 public void realRun() throws InterruptedException {
995 lock.writeLock().lock();
996 locked.countDown();
997 c.await();
998 lock.writeLock().unlock();
999 }});
1000
1001 await(locked);
1002 lock.writeLock().lock();
1003 assertHasWaiters(lock, c, t);
1004 c.signal();
1005 assertHasNoWaiters(lock, c);
1006 assertTrue(t.isAlive());
1007 lock.writeLock().unlock();
1008 awaitTermination(t);
1009 }
1010
1011 /**
1012 * awaitUninterruptibly is uninterruptible
1013 */
1014 public void testAwaitUninterruptibly() { testAwaitUninterruptibly(false); }
1015 public void testAwaitUninterruptibly_fair() { testAwaitUninterruptibly(true); }
1016 public void testAwaitUninterruptibly(boolean fair) {
1017 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1018 final Condition c = lock.writeLock().newCondition();
1019 final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
1020
1021 Thread t1 = newStartedThread(new CheckedRunnable() {
1022 public void realRun() {
1023 // Interrupt before awaitUninterruptibly
1024 lock.writeLock().lock();
1025 pleaseInterrupt.countDown();
1026 Thread.currentThread().interrupt();
1027 c.awaitUninterruptibly();
1028 assertTrue(Thread.interrupted());
1029 lock.writeLock().unlock();
1030 }});
1031
1032 Thread t2 = newStartedThread(new CheckedRunnable() {
1033 public void realRun() {
1034 // Interrupt during awaitUninterruptibly
1035 lock.writeLock().lock();
1036 pleaseInterrupt.countDown();
1037 c.awaitUninterruptibly();
1038 assertTrue(Thread.interrupted());
1039 lock.writeLock().unlock();
1040 }});
1041
1042 await(pleaseInterrupt);
1043 lock.writeLock().lock();
1044 lock.writeLock().unlock();
1045 t2.interrupt();
1046
1047 assertThreadStaysAlive(t1);
1048 assertTrue(t2.isAlive());
1049
1050 lock.writeLock().lock();
1051 c.signalAll();
1052 lock.writeLock().unlock();
1053
1054 awaitTermination(t1);
1055 awaitTermination(t2);
1056 }
1057
1058 /**
1059 * await/awaitNanos/awaitUntil is interruptible
1060 */
1061 public void testInterruptible_await() { testInterruptible(false, AwaitMethod.await); }
1062 public void testInterruptible_await_fair() { testInterruptible(true, AwaitMethod.await); }
1063 public void testInterruptible_awaitTimed() { testInterruptible(false, AwaitMethod.awaitTimed); }
1064 public void testInterruptible_awaitTimed_fair() { testInterruptible(true, AwaitMethod.awaitTimed); }
1065 public void testInterruptible_awaitNanos() { testInterruptible(false, AwaitMethod.awaitNanos); }
1066 public void testInterruptible_awaitNanos_fair() { testInterruptible(true, AwaitMethod.awaitNanos); }
1067 public void testInterruptible_awaitUntil() { testInterruptible(false, AwaitMethod.awaitUntil); }
1068 public void testInterruptible_awaitUntil_fair() { testInterruptible(true, AwaitMethod.awaitUntil); }
1069 public void testInterruptible(boolean fair, final AwaitMethod awaitMethod) {
1070 final PublicReentrantReadWriteLock lock =
1071 new PublicReentrantReadWriteLock(fair);
1072 final Condition c = lock.writeLock().newCondition();
1073 final CountDownLatch locked = new CountDownLatch(1);
1074 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1075 public void realRun() throws InterruptedException {
1076 lock.writeLock().lock();
1077 assertWriteLockedByMoi(lock);
1078 assertHasNoWaiters(lock, c);
1079 locked.countDown();
1080 try {
1081 await(c, awaitMethod);
1082 } finally {
1083 assertWriteLockedByMoi(lock);
1084 assertHasNoWaiters(lock, c);
1085 lock.writeLock().unlock();
1086 assertFalse(Thread.interrupted());
1087 }
1088 }});
1089
1090 await(locked);
1091 assertHasWaiters(lock, c, t);
1092 t.interrupt();
1093 awaitTermination(t);
1094 assertNotWriteLocked(lock);
1095 }
1096
1097 /**
1098 * signalAll wakes up all threads
1099 */
1100 public void testSignalAll_await() { testSignalAll(false, AwaitMethod.await); }
1101 public void testSignalAll_await_fair() { testSignalAll(true, AwaitMethod.await); }
1102 public void testSignalAll_awaitTimed() { testSignalAll(false, AwaitMethod.awaitTimed); }
1103 public void testSignalAll_awaitTimed_fair() { testSignalAll(true, AwaitMethod.awaitTimed); }
1104 public void testSignalAll_awaitNanos() { testSignalAll(false, AwaitMethod.awaitNanos); }
1105 public void testSignalAll_awaitNanos_fair() { testSignalAll(true, AwaitMethod.awaitNanos); }
1106 public void testSignalAll_awaitUntil() { testSignalAll(false, AwaitMethod.awaitUntil); }
1107 public void testSignalAll_awaitUntil_fair() { testSignalAll(true, AwaitMethod.awaitUntil); }
1108 public void testSignalAll(boolean fair, final AwaitMethod awaitMethod) {
1109 final PublicReentrantReadWriteLock lock =
1110 new PublicReentrantReadWriteLock(fair);
1111 final Condition c = lock.writeLock().newCondition();
1112 final CountDownLatch locked = new CountDownLatch(2);
1113 final Lock writeLock = lock.writeLock();
1114 class Awaiter extends CheckedRunnable {
1115 public void realRun() throws InterruptedException {
1116 writeLock.lock();
1117 locked.countDown();
1118 await(c, awaitMethod);
1119 writeLock.unlock();
1120 }
1121 }
1122
1123 Thread t1 = newStartedThread(new Awaiter());
1124 Thread t2 = newStartedThread(new Awaiter());
1125
1126 await(locked);
1127 writeLock.lock();
1128 assertHasWaiters(lock, c, t1, t2);
1129 c.signalAll();
1130 assertHasNoWaiters(lock, c);
1131 writeLock.unlock();
1132 awaitTermination(t1);
1133 awaitTermination(t2);
1134 }
1135
1136 /**
1137 * signal wakes up waiting threads in FIFO order
1138 */
1139 public void testSignalWakesFifo() { testSignalWakesFifo(false); }
1140 public void testSignalWakesFifo_fair() { testSignalWakesFifo(true); }
1141 public void testSignalWakesFifo(boolean fair) {
1142 final PublicReentrantReadWriteLock lock =
1143 new PublicReentrantReadWriteLock(fair);
1144 final Condition c = lock.writeLock().newCondition();
1145 final CountDownLatch locked1 = new CountDownLatch(1);
1146 final CountDownLatch locked2 = new CountDownLatch(1);
1147 final Lock writeLock = lock.writeLock();
1148 Thread t1 = newStartedThread(new CheckedRunnable() {
1149 public void realRun() throws InterruptedException {
1150 writeLock.lock();
1151 locked1.countDown();
1152 c.await();
1153 writeLock.unlock();
1154 }});
1155
1156 await(locked1);
1157
1158 Thread t2 = newStartedThread(new CheckedRunnable() {
1159 public void realRun() throws InterruptedException {
1160 writeLock.lock();
1161 locked2.countDown();
1162 c.await();
1163 writeLock.unlock();
1164 }});
1165
1166 await(locked2);
1167
1168 writeLock.lock();
1169 assertHasWaiters(lock, c, t1, t2);
1170 assertFalse(lock.hasQueuedThreads());
1171 c.signal();
1172 assertHasWaiters(lock, c, t2);
1173 assertTrue(lock.hasQueuedThread(t1));
1174 assertFalse(lock.hasQueuedThread(t2));
1175 c.signal();
1176 assertHasNoWaiters(lock, c);
1177 assertTrue(lock.hasQueuedThread(t1));
1178 assertTrue(lock.hasQueuedThread(t2));
1179 writeLock.unlock();
1180 awaitTermination(t1);
1181 awaitTermination(t2);
1182 }
1183
1184 /**
1185 * await after multiple reentrant locking preserves lock count
1186 */
1187 public void testAwaitLockCount() { testAwaitLockCount(false); }
1188 public void testAwaitLockCount_fair() { testAwaitLockCount(true); }
1189 public void testAwaitLockCount(boolean fair) {
1190 final PublicReentrantReadWriteLock lock =
1191 new PublicReentrantReadWriteLock(fair);
1192 final Condition c = lock.writeLock().newCondition();
1193 final CountDownLatch locked = new CountDownLatch(2);
1194 Thread t1 = newStartedThread(new CheckedRunnable() {
1195 public void realRun() throws InterruptedException {
1196 lock.writeLock().lock();
1197 assertWriteLockedByMoi(lock);
1198 assertEquals(1, lock.writeLock().getHoldCount());
1199 locked.countDown();
1200 c.await();
1201 assertWriteLockedByMoi(lock);
1202 assertEquals(1, lock.writeLock().getHoldCount());
1203 lock.writeLock().unlock();
1204 }});
1205
1206 Thread t2 = newStartedThread(new CheckedRunnable() {
1207 public void realRun() throws InterruptedException {
1208 lock.writeLock().lock();
1209 lock.writeLock().lock();
1210 assertWriteLockedByMoi(lock);
1211 assertEquals(2, lock.writeLock().getHoldCount());
1212 locked.countDown();
1213 c.await();
1214 assertWriteLockedByMoi(lock);
1215 assertEquals(2, lock.writeLock().getHoldCount());
1216 lock.writeLock().unlock();
1217 lock.writeLock().unlock();
1218 }});
1219
1220 await(locked);
1221 lock.writeLock().lock();
1222 assertHasWaiters(lock, c, t1, t2);
1223 c.signalAll();
1224 assertHasNoWaiters(lock, c);
1225 lock.writeLock().unlock();
1226 awaitTermination(t1);
1227 awaitTermination(t2);
1228 }
1229
1230 /**
1231 * A serialized lock deserializes as unlocked
1232 */
1233 public void testSerialization() { testSerialization(false); }
1234 public void testSerialization_fair() { testSerialization(true); }
1235 public void testSerialization(boolean fair) {
1236 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1237 lock.writeLock().lock();
1238 lock.readLock().lock();
1239
1240 ReentrantReadWriteLock clone = serialClone(lock);
1241 assertEquals(lock.isFair(), clone.isFair());
1242 assertTrue(lock.isWriteLocked());
1243 assertFalse(clone.isWriteLocked());
1244 assertEquals(1, lock.getReadLockCount());
1245 assertEquals(0, clone.getReadLockCount());
1246 clone.writeLock().lock();
1247 clone.readLock().lock();
1248 assertTrue(clone.isWriteLocked());
1249 assertEquals(1, clone.getReadLockCount());
1250 clone.readLock().unlock();
1251 clone.writeLock().unlock();
1252 assertFalse(clone.isWriteLocked());
1253 assertEquals(1, lock.getReadLockCount());
1254 assertEquals(0, clone.getReadLockCount());
1255 }
1256
1257 /**
1258 * hasQueuedThreads reports whether there are waiting threads
1259 */
1260 public void testHasQueuedThreads() { testHasQueuedThreads(false); }
1261 public void testHasQueuedThreads_fair() { testHasQueuedThreads(true); }
1262 public void testHasQueuedThreads(boolean fair) {
1263 final PublicReentrantReadWriteLock lock =
1264 new PublicReentrantReadWriteLock(fair);
1265 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1266 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1267 assertFalse(lock.hasQueuedThreads());
1268 lock.writeLock().lock();
1269 assertFalse(lock.hasQueuedThreads());
1270 t1.start();
1271 waitForQueuedThread(lock, t1);
1272 assertTrue(lock.hasQueuedThreads());
1273 t2.start();
1274 waitForQueuedThread(lock, t2);
1275 assertTrue(lock.hasQueuedThreads());
1276 t1.interrupt();
1277 awaitTermination(t1);
1278 assertTrue(lock.hasQueuedThreads());
1279 lock.writeLock().unlock();
1280 awaitTermination(t2);
1281 assertFalse(lock.hasQueuedThreads());
1282 }
1283
1284 /**
1285 * hasQueuedThread(null) throws NPE
1286 */
1287 public void testHasQueuedThreadNPE() { testHasQueuedThreadNPE(false); }
1288 public void testHasQueuedThreadNPE_fair() { testHasQueuedThreadNPE(true); }
1289 public void testHasQueuedThreadNPE(boolean fair) {
1290 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1291 try {
1292 lock.hasQueuedThread(null);
1293 shouldThrow();
1294 } catch (NullPointerException success) {}
1295 }
1296
1297 /**
1298 * hasQueuedThread reports whether a thread is queued
1299 */
1300 public void testHasQueuedThread() { testHasQueuedThread(false); }
1301 public void testHasQueuedThread_fair() { testHasQueuedThread(true); }
1302 public void testHasQueuedThread(boolean fair) {
1303 final PublicReentrantReadWriteLock lock =
1304 new PublicReentrantReadWriteLock(fair);
1305 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1306 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1307 assertFalse(lock.hasQueuedThread(t1));
1308 assertFalse(lock.hasQueuedThread(t2));
1309 lock.writeLock().lock();
1310 t1.start();
1311 waitForQueuedThread(lock, t1);
1312 assertTrue(lock.hasQueuedThread(t1));
1313 assertFalse(lock.hasQueuedThread(t2));
1314 t2.start();
1315 waitForQueuedThread(lock, t2);
1316 assertTrue(lock.hasQueuedThread(t1));
1317 assertTrue(lock.hasQueuedThread(t2));
1318 t1.interrupt();
1319 awaitTermination(t1);
1320 assertFalse(lock.hasQueuedThread(t1));
1321 assertTrue(lock.hasQueuedThread(t2));
1322 lock.writeLock().unlock();
1323 awaitTermination(t2);
1324 assertFalse(lock.hasQueuedThread(t1));
1325 assertFalse(lock.hasQueuedThread(t2));
1326 }
1327
1328 /**
1329 * getQueueLength reports number of waiting threads
1330 */
1331 public void testGetQueueLength() { testGetQueueLength(false); }
1332 public void testGetQueueLength_fair() { testGetQueueLength(true); }
1333 public void testGetQueueLength(boolean fair) {
1334 final PublicReentrantReadWriteLock lock =
1335 new PublicReentrantReadWriteLock(fair);
1336 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1337 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1338 assertEquals(0, lock.getQueueLength());
1339 lock.writeLock().lock();
1340 t1.start();
1341 waitForQueuedThread(lock, t1);
1342 assertEquals(1, lock.getQueueLength());
1343 t2.start();
1344 waitForQueuedThread(lock, t2);
1345 assertEquals(2, lock.getQueueLength());
1346 t1.interrupt();
1347 awaitTermination(t1);
1348 assertEquals(1, lock.getQueueLength());
1349 lock.writeLock().unlock();
1350 awaitTermination(t2);
1351 assertEquals(0, lock.getQueueLength());
1352 }
1353
1354 /**
1355 * getQueuedThreads includes waiting threads
1356 */
1357 public void testGetQueuedThreads() { testGetQueuedThreads(false); }
1358 public void testGetQueuedThreads_fair() { testGetQueuedThreads(true); }
1359 public void testGetQueuedThreads(boolean fair) {
1360 final PublicReentrantReadWriteLock lock =
1361 new PublicReentrantReadWriteLock(fair);
1362 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1363 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1364 assertTrue(lock.getQueuedThreads().isEmpty());
1365 lock.writeLock().lock();
1366 assertTrue(lock.getQueuedThreads().isEmpty());
1367 t1.start();
1368 waitForQueuedThread(lock, t1);
1369 assertEquals(1, lock.getQueuedThreads().size());
1370 assertTrue(lock.getQueuedThreads().contains(t1));
1371 t2.start();
1372 waitForQueuedThread(lock, t2);
1373 assertEquals(2, lock.getQueuedThreads().size());
1374 assertTrue(lock.getQueuedThreads().contains(t1));
1375 assertTrue(lock.getQueuedThreads().contains(t2));
1376 t1.interrupt();
1377 awaitTermination(t1);
1378 assertFalse(lock.getQueuedThreads().contains(t1));
1379 assertTrue(lock.getQueuedThreads().contains(t2));
1380 assertEquals(1, lock.getQueuedThreads().size());
1381 lock.writeLock().unlock();
1382 awaitTermination(t2);
1383 assertTrue(lock.getQueuedThreads().isEmpty());
1384 }
1385
1386 /**
1387 * hasWaiters throws NPE if null
1388 */
1389 public void testHasWaitersNPE() { testHasWaitersNPE(false); }
1390 public void testHasWaitersNPE_fair() { testHasWaitersNPE(true); }
1391 public void testHasWaitersNPE(boolean fair) {
1392 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1393 try {
1394 lock.hasWaiters(null);
1395 shouldThrow();
1396 } catch (NullPointerException success) {}
1397 }
1398
1399 /**
1400 * getWaitQueueLength throws NPE if null
1401 */
1402 public void testGetWaitQueueLengthNPE() { testGetWaitQueueLengthNPE(false); }
1403 public void testGetWaitQueueLengthNPE_fair() { testGetWaitQueueLengthNPE(true); }
1404 public void testGetWaitQueueLengthNPE(boolean fair) {
1405 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1406 try {
1407 lock.getWaitQueueLength(null);
1408 shouldThrow();
1409 } catch (NullPointerException success) {}
1410 }
1411
1412 /**
1413 * getWaitingThreads throws NPE if null
1414 */
1415 public void testGetWaitingThreadsNPE() { testGetWaitingThreadsNPE(false); }
1416 public void testGetWaitingThreadsNPE_fair() { testGetWaitingThreadsNPE(true); }
1417 public void testGetWaitingThreadsNPE(boolean fair) {
1418 final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock(fair);
1419 try {
1420 lock.getWaitingThreads(null);
1421 shouldThrow();
1422 } catch (NullPointerException success) {}
1423 }
1424
1425 /**
1426 * hasWaiters throws IllegalArgumentException if not owned
1427 */
1428 public void testHasWaitersIAE() { testHasWaitersIAE(false); }
1429 public void testHasWaitersIAE_fair() { testHasWaitersIAE(true); }
1430 public void testHasWaitersIAE(boolean fair) {
1431 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1432 final Condition c = lock.writeLock().newCondition();
1433 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1434 try {
1435 lock2.hasWaiters(c);
1436 shouldThrow();
1437 } catch (IllegalArgumentException success) {}
1438 }
1439
1440 /**
1441 * hasWaiters throws IllegalMonitorStateException if not locked
1442 */
1443 public void testHasWaitersIMSE() { testHasWaitersIMSE(false); }
1444 public void testHasWaitersIMSE_fair() { testHasWaitersIMSE(true); }
1445 public void testHasWaitersIMSE(boolean fair) {
1446 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1447 final Condition c = lock.writeLock().newCondition();
1448 try {
1449 lock.hasWaiters(c);
1450 shouldThrow();
1451 } catch (IllegalMonitorStateException success) {}
1452 }
1453
1454 /**
1455 * getWaitQueueLength throws IllegalArgumentException if not owned
1456 */
1457 public void testGetWaitQueueLengthIAE() { testGetWaitQueueLengthIAE(false); }
1458 public void testGetWaitQueueLengthIAE_fair() { testGetWaitQueueLengthIAE(true); }
1459 public void testGetWaitQueueLengthIAE(boolean fair) {
1460 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1461 final Condition c = lock.writeLock().newCondition();
1462 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1463 try {
1464 lock2.getWaitQueueLength(c);
1465 shouldThrow();
1466 } catch (IllegalArgumentException success) {}
1467 }
1468
1469 /**
1470 * getWaitQueueLength throws IllegalMonitorStateException if not locked
1471 */
1472 public void testGetWaitQueueLengthIMSE() { testGetWaitQueueLengthIMSE(false); }
1473 public void testGetWaitQueueLengthIMSE_fair() { testGetWaitQueueLengthIMSE(true); }
1474 public void testGetWaitQueueLengthIMSE(boolean fair) {
1475 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1476 final Condition c = lock.writeLock().newCondition();
1477 try {
1478 lock.getWaitQueueLength(c);
1479 shouldThrow();
1480 } catch (IllegalMonitorStateException success) {}
1481 }
1482
1483 /**
1484 * getWaitingThreads throws IllegalArgumentException if not owned
1485 */
1486 public void testGetWaitingThreadsIAE() { testGetWaitingThreadsIAE(false); }
1487 public void testGetWaitingThreadsIAE_fair() { testGetWaitingThreadsIAE(true); }
1488 public void testGetWaitingThreadsIAE(boolean fair) {
1489 final PublicReentrantReadWriteLock lock =
1490 new PublicReentrantReadWriteLock(fair);
1491 final Condition c = lock.writeLock().newCondition();
1492 final PublicReentrantReadWriteLock lock2 =
1493 new PublicReentrantReadWriteLock(fair);
1494 try {
1495 lock2.getWaitingThreads(c);
1496 shouldThrow();
1497 } catch (IllegalArgumentException success) {}
1498 }
1499
1500 /**
1501 * getWaitingThreads throws IllegalMonitorStateException if not locked
1502 */
1503 public void testGetWaitingThreadsIMSE() { testGetWaitingThreadsIMSE(false); }
1504 public void testGetWaitingThreadsIMSE_fair() { testGetWaitingThreadsIMSE(true); }
1505 public void testGetWaitingThreadsIMSE(boolean fair) {
1506 final PublicReentrantReadWriteLock lock =
1507 new PublicReentrantReadWriteLock(fair);
1508 final Condition c = lock.writeLock().newCondition();
1509 try {
1510 lock.getWaitingThreads(c);
1511 shouldThrow();
1512 } catch (IllegalMonitorStateException success) {}
1513 }
1514
1515 /**
1516 * hasWaiters returns true when a thread is waiting, else false
1517 */
1518 public void testHasWaiters() { testHasWaiters(false); }
1519 public void testHasWaiters_fair() { testHasWaiters(true); }
1520 public void testHasWaiters(boolean fair) {
1521 final PublicReentrantReadWriteLock lock =
1522 new PublicReentrantReadWriteLock(fair);
1523 final Condition c = lock.writeLock().newCondition();
1524 final CountDownLatch locked = new CountDownLatch(1);
1525 Thread t = newStartedThread(new CheckedRunnable() {
1526 public void realRun() throws InterruptedException {
1527 lock.writeLock().lock();
1528 assertHasNoWaiters(lock, c);
1529 assertFalse(lock.hasWaiters(c));
1530 locked.countDown();
1531 c.await();
1532 assertHasNoWaiters(lock, c);
1533 assertFalse(lock.hasWaiters(c));
1534 lock.writeLock().unlock();
1535 }});
1536
1537 await(locked);
1538 lock.writeLock().lock();
1539 assertHasWaiters(lock, c, t);
1540 assertTrue(lock.hasWaiters(c));
1541 c.signal();
1542 assertHasNoWaiters(lock, c);
1543 assertFalse(lock.hasWaiters(c));
1544 lock.writeLock().unlock();
1545 awaitTermination(t);
1546 assertHasNoWaiters(lock, c);
1547 }
1548
1549 /**
1550 * getWaitQueueLength returns number of waiting threads
1551 */
1552 public void testGetWaitQueueLength() { testGetWaitQueueLength(false); }
1553 public void testGetWaitQueueLength_fair() { testGetWaitQueueLength(true); }
1554 public void testGetWaitQueueLength(boolean fair) {
1555 final PublicReentrantReadWriteLock lock =
1556 new PublicReentrantReadWriteLock(fair);
1557 final Condition c = lock.writeLock().newCondition();
1558 final CountDownLatch locked = new CountDownLatch(1);
1559 Thread t = newStartedThread(new CheckedRunnable() {
1560 public void realRun() throws InterruptedException {
1561 lock.writeLock().lock();
1562 assertEquals(0, lock.getWaitQueueLength(c));
1563 locked.countDown();
1564 c.await();
1565 lock.writeLock().unlock();
1566 }});
1567
1568 await(locked);
1569 lock.writeLock().lock();
1570 assertHasWaiters(lock, c, t);
1571 assertEquals(1, lock.getWaitQueueLength(c));
1572 c.signal();
1573 assertHasNoWaiters(lock, c);
1574 assertEquals(0, lock.getWaitQueueLength(c));
1575 lock.writeLock().unlock();
1576 awaitTermination(t);
1577 }
1578
1579 /**
1580 * getWaitingThreads returns only and all waiting threads
1581 */
1582 public void testGetWaitingThreads() { testGetWaitingThreads(false); }
1583 public void testGetWaitingThreads_fair() { testGetWaitingThreads(true); }
1584 public void testGetWaitingThreads(boolean fair) {
1585 final PublicReentrantReadWriteLock lock =
1586 new PublicReentrantReadWriteLock(fair);
1587 final Condition c = lock.writeLock().newCondition();
1588 final CountDownLatch locked1 = new CountDownLatch(1);
1589 final CountDownLatch locked2 = new CountDownLatch(1);
1590 Thread t1 = new Thread(new CheckedRunnable() {
1591 public void realRun() throws InterruptedException {
1592 lock.writeLock().lock();
1593 assertTrue(lock.getWaitingThreads(c).isEmpty());
1594 locked1.countDown();
1595 c.await();
1596 lock.writeLock().unlock();
1597 }});
1598
1599 Thread t2 = new Thread(new CheckedRunnable() {
1600 public void realRun() throws InterruptedException {
1601 lock.writeLock().lock();
1602 assertFalse(lock.getWaitingThreads(c).isEmpty());
1603 locked2.countDown();
1604 c.await();
1605 lock.writeLock().unlock();
1606 }});
1607
1608 lock.writeLock().lock();
1609 assertTrue(lock.getWaitingThreads(c).isEmpty());
1610 lock.writeLock().unlock();
1611
1612 t1.start();
1613 await(locked1);
1614 t2.start();
1615 await(locked2);
1616
1617 lock.writeLock().lock();
1618 assertTrue(lock.hasWaiters(c));
1619 assertTrue(lock.getWaitingThreads(c).contains(t1));
1620 assertTrue(lock.getWaitingThreads(c).contains(t2));
1621 assertEquals(2, lock.getWaitingThreads(c).size());
1622 c.signalAll();
1623 assertHasNoWaiters(lock, c);
1624 lock.writeLock().unlock();
1625
1626 awaitTermination(t1);
1627 awaitTermination(t2);
1628
1629 assertHasNoWaiters(lock, c);
1630 }
1631
1632 /**
1633 * toString indicates current lock state
1634 */
1635 public void testToString() { testToString(false); }
1636 public void testToString_fair() { testToString(true); }
1637 public void testToString(boolean fair) {
1638 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1639 assertTrue(lock.toString().contains("Write locks = 0"));
1640 assertTrue(lock.toString().contains("Read locks = 0"));
1641 lock.writeLock().lock();
1642 assertTrue(lock.toString().contains("Write locks = 1"));
1643 assertTrue(lock.toString().contains("Read locks = 0"));
1644 lock.writeLock().unlock();
1645 lock.readLock().lock();
1646 lock.readLock().lock();
1647 assertTrue(lock.toString().contains("Write locks = 0"));
1648 assertTrue(lock.toString().contains("Read locks = 2"));
1649 }
1650
1651 /**
1652 * readLock.toString indicates current lock state
1653 */
1654 public void testReadLockToString() { testReadLockToString(false); }
1655 public void testReadLockToString_fair() { testReadLockToString(true); }
1656 public void testReadLockToString(boolean fair) {
1657 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1658 assertTrue(lock.readLock().toString().contains("Read locks = 0"));
1659 lock.readLock().lock();
1660 lock.readLock().lock();
1661 assertTrue(lock.readLock().toString().contains("Read locks = 2"));
1662 }
1663
1664 /**
1665 * writeLock.toString indicates current lock state
1666 */
1667 public void testWriteLockToString() { testWriteLockToString(false); }
1668 public void testWriteLockToString_fair() { testWriteLockToString(true); }
1669 public void testWriteLockToString(boolean fair) {
1670 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1671 assertTrue(lock.writeLock().toString().contains("Unlocked"));
1672 lock.writeLock().lock();
1673 assertTrue(lock.writeLock().toString().contains("Locked"));
1674 lock.writeLock().unlock();
1675 assertTrue(lock.writeLock().toString().contains("Unlocked"));
1676 }
1677
1678 }