ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.79
Committed: Sun Jan 1 20:34:39 2017 UTC (7 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.78: +46 -38 lines
Log Message:
minor test hygiene improvements

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