ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.82
Committed: Tue Jan 23 20:44:11 2018 UTC (6 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.81: +1 -2 lines
Log Message:
migrate from AssertionFailedError to AssertionError

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.Test;
21 import junit.framework.TestSuite;
22
23 @SuppressWarnings("WaitNotInLoop") // we implement spurious-wakeup freedom
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 AssertionError("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 Lock lock = new ReentrantReadWriteLock(fair).writeLock();
1013 final Condition condition = lock.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.lock();
1020 pleaseInterrupt.countDown();
1021 Thread.currentThread().interrupt();
1022 condition.awaitUninterruptibly();
1023 assertTrue(Thread.interrupted());
1024 lock.unlock();
1025 }});
1026
1027 Thread t2 = newStartedThread(new CheckedRunnable() {
1028 public void realRun() {
1029 // Interrupt during awaitUninterruptibly
1030 lock.lock();
1031 pleaseInterrupt.countDown();
1032 condition.awaitUninterruptibly();
1033 assertTrue(Thread.interrupted());
1034 lock.unlock();
1035 }});
1036
1037 await(pleaseInterrupt);
1038 t2.interrupt();
1039 lock.lock();
1040 lock.unlock();
1041 assertThreadBlocks(t1, Thread.State.WAITING);
1042 assertThreadBlocks(t2, Thread.State.WAITING);
1043
1044 lock.lock();
1045 condition.signalAll();
1046 lock.unlock();
1047
1048 awaitTermination(t1);
1049 awaitTermination(t2);
1050 }
1051
1052 /**
1053 * await/awaitNanos/awaitUntil is interruptible
1054 */
1055 public void testInterruptible_await() { testInterruptible(false, AwaitMethod.await); }
1056 public void testInterruptible_await_fair() { testInterruptible(true, AwaitMethod.await); }
1057 public void testInterruptible_awaitTimed() { testInterruptible(false, AwaitMethod.awaitTimed); }
1058 public void testInterruptible_awaitTimed_fair() { testInterruptible(true, AwaitMethod.awaitTimed); }
1059 public void testInterruptible_awaitNanos() { testInterruptible(false, AwaitMethod.awaitNanos); }
1060 public void testInterruptible_awaitNanos_fair() { testInterruptible(true, AwaitMethod.awaitNanos); }
1061 public void testInterruptible_awaitUntil() { testInterruptible(false, AwaitMethod.awaitUntil); }
1062 public void testInterruptible_awaitUntil_fair() { testInterruptible(true, AwaitMethod.awaitUntil); }
1063 public void testInterruptible(boolean fair, final AwaitMethod awaitMethod) {
1064 final PublicReentrantReadWriteLock lock =
1065 new PublicReentrantReadWriteLock(fair);
1066 final Condition c = lock.writeLock().newCondition();
1067 final CountDownLatch locked = new CountDownLatch(1);
1068 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1069 public void realRun() throws InterruptedException {
1070 lock.writeLock().lock();
1071 assertWriteLockedByMoi(lock);
1072 assertHasNoWaiters(lock, c);
1073 locked.countDown();
1074 try {
1075 await(c, awaitMethod);
1076 } finally {
1077 assertWriteLockedByMoi(lock);
1078 assertHasNoWaiters(lock, c);
1079 lock.writeLock().unlock();
1080 assertFalse(Thread.interrupted());
1081 }
1082 }});
1083
1084 await(locked);
1085 assertHasWaiters(lock, c, t);
1086 t.interrupt();
1087 awaitTermination(t);
1088 assertNotWriteLocked(lock);
1089 }
1090
1091 /**
1092 * signalAll wakes up all threads
1093 */
1094 public void testSignalAll_await() { testSignalAll(false, AwaitMethod.await); }
1095 public void testSignalAll_await_fair() { testSignalAll(true, AwaitMethod.await); }
1096 public void testSignalAll_awaitTimed() { testSignalAll(false, AwaitMethod.awaitTimed); }
1097 public void testSignalAll_awaitTimed_fair() { testSignalAll(true, AwaitMethod.awaitTimed); }
1098 public void testSignalAll_awaitNanos() { testSignalAll(false, AwaitMethod.awaitNanos); }
1099 public void testSignalAll_awaitNanos_fair() { testSignalAll(true, AwaitMethod.awaitNanos); }
1100 public void testSignalAll_awaitUntil() { testSignalAll(false, AwaitMethod.awaitUntil); }
1101 public void testSignalAll_awaitUntil_fair() { testSignalAll(true, AwaitMethod.awaitUntil); }
1102 public void testSignalAll(boolean fair, final AwaitMethod awaitMethod) {
1103 final PublicReentrantReadWriteLock lock =
1104 new PublicReentrantReadWriteLock(fair);
1105 final Condition c = lock.writeLock().newCondition();
1106 final CountDownLatch locked = new CountDownLatch(2);
1107 final Lock writeLock = lock.writeLock();
1108 class Awaiter extends CheckedRunnable {
1109 public void realRun() throws InterruptedException {
1110 writeLock.lock();
1111 locked.countDown();
1112 await(c, awaitMethod);
1113 writeLock.unlock();
1114 }
1115 }
1116
1117 Thread t1 = newStartedThread(new Awaiter());
1118 Thread t2 = newStartedThread(new Awaiter());
1119
1120 await(locked);
1121 writeLock.lock();
1122 assertHasWaiters(lock, c, t1, t2);
1123 c.signalAll();
1124 assertHasNoWaiters(lock, c);
1125 writeLock.unlock();
1126 awaitTermination(t1);
1127 awaitTermination(t2);
1128 }
1129
1130 /**
1131 * signal wakes up waiting threads in FIFO order
1132 */
1133 public void testSignalWakesFifo() { testSignalWakesFifo(false); }
1134 public void testSignalWakesFifo_fair() { testSignalWakesFifo(true); }
1135 public void testSignalWakesFifo(boolean fair) {
1136 final PublicReentrantReadWriteLock lock =
1137 new PublicReentrantReadWriteLock(fair);
1138 final Condition c = lock.writeLock().newCondition();
1139 final CountDownLatch locked1 = new CountDownLatch(1);
1140 final CountDownLatch locked2 = new CountDownLatch(1);
1141 final Lock writeLock = lock.writeLock();
1142 Thread t1 = newStartedThread(new CheckedRunnable() {
1143 public void realRun() throws InterruptedException {
1144 writeLock.lock();
1145 locked1.countDown();
1146 c.await();
1147 writeLock.unlock();
1148 }});
1149
1150 await(locked1);
1151
1152 Thread t2 = newStartedThread(new CheckedRunnable() {
1153 public void realRun() throws InterruptedException {
1154 writeLock.lock();
1155 locked2.countDown();
1156 c.await();
1157 writeLock.unlock();
1158 }});
1159
1160 await(locked2);
1161
1162 writeLock.lock();
1163 assertHasWaiters(lock, c, t1, t2);
1164 assertFalse(lock.hasQueuedThreads());
1165 c.signal();
1166 assertHasWaiters(lock, c, t2);
1167 assertTrue(lock.hasQueuedThread(t1));
1168 assertFalse(lock.hasQueuedThread(t2));
1169 c.signal();
1170 assertHasNoWaiters(lock, c);
1171 assertTrue(lock.hasQueuedThread(t1));
1172 assertTrue(lock.hasQueuedThread(t2));
1173 writeLock.unlock();
1174 awaitTermination(t1);
1175 awaitTermination(t2);
1176 }
1177
1178 /**
1179 * await after multiple reentrant locking preserves lock count
1180 */
1181 public void testAwaitLockCount() { testAwaitLockCount(false); }
1182 public void testAwaitLockCount_fair() { testAwaitLockCount(true); }
1183 public void testAwaitLockCount(boolean fair) {
1184 final PublicReentrantReadWriteLock lock =
1185 new PublicReentrantReadWriteLock(fair);
1186 final Condition c = lock.writeLock().newCondition();
1187 final CountDownLatch locked = new CountDownLatch(2);
1188 Thread t1 = newStartedThread(new CheckedRunnable() {
1189 public void realRun() throws InterruptedException {
1190 lock.writeLock().lock();
1191 assertWriteLockedByMoi(lock);
1192 assertEquals(1, lock.writeLock().getHoldCount());
1193 locked.countDown();
1194 c.await();
1195 assertWriteLockedByMoi(lock);
1196 assertEquals(1, lock.writeLock().getHoldCount());
1197 lock.writeLock().unlock();
1198 }});
1199
1200 Thread t2 = newStartedThread(new CheckedRunnable() {
1201 public void realRun() throws InterruptedException {
1202 lock.writeLock().lock();
1203 lock.writeLock().lock();
1204 assertWriteLockedByMoi(lock);
1205 assertEquals(2, lock.writeLock().getHoldCount());
1206 locked.countDown();
1207 c.await();
1208 assertWriteLockedByMoi(lock);
1209 assertEquals(2, lock.writeLock().getHoldCount());
1210 lock.writeLock().unlock();
1211 lock.writeLock().unlock();
1212 }});
1213
1214 await(locked);
1215 lock.writeLock().lock();
1216 assertHasWaiters(lock, c, t1, t2);
1217 c.signalAll();
1218 assertHasNoWaiters(lock, c);
1219 lock.writeLock().unlock();
1220 awaitTermination(t1);
1221 awaitTermination(t2);
1222 }
1223
1224 /**
1225 * A serialized lock deserializes as unlocked
1226 */
1227 public void testSerialization() { testSerialization(false); }
1228 public void testSerialization_fair() { testSerialization(true); }
1229 public void testSerialization(boolean fair) {
1230 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1231 lock.writeLock().lock();
1232 lock.readLock().lock();
1233
1234 ReentrantReadWriteLock clone = serialClone(lock);
1235 assertEquals(lock.isFair(), clone.isFair());
1236 assertTrue(lock.isWriteLocked());
1237 assertFalse(clone.isWriteLocked());
1238 assertEquals(1, lock.getReadLockCount());
1239 assertEquals(0, clone.getReadLockCount());
1240 clone.writeLock().lock();
1241 clone.readLock().lock();
1242 assertTrue(clone.isWriteLocked());
1243 assertEquals(1, clone.getReadLockCount());
1244 clone.readLock().unlock();
1245 clone.writeLock().unlock();
1246 assertFalse(clone.isWriteLocked());
1247 assertEquals(1, lock.getReadLockCount());
1248 assertEquals(0, clone.getReadLockCount());
1249 }
1250
1251 /**
1252 * hasQueuedThreads reports whether there are waiting threads
1253 */
1254 public void testHasQueuedThreads() { testHasQueuedThreads(false); }
1255 public void testHasQueuedThreads_fair() { testHasQueuedThreads(true); }
1256 public void testHasQueuedThreads(boolean fair) {
1257 final PublicReentrantReadWriteLock lock =
1258 new PublicReentrantReadWriteLock(fair);
1259 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1260 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1261 assertFalse(lock.hasQueuedThreads());
1262 lock.writeLock().lock();
1263 assertFalse(lock.hasQueuedThreads());
1264 t1.start();
1265 waitForQueuedThread(lock, t1);
1266 assertTrue(lock.hasQueuedThreads());
1267 t2.start();
1268 waitForQueuedThread(lock, t2);
1269 assertTrue(lock.hasQueuedThreads());
1270 t1.interrupt();
1271 awaitTermination(t1);
1272 assertTrue(lock.hasQueuedThreads());
1273 lock.writeLock().unlock();
1274 awaitTermination(t2);
1275 assertFalse(lock.hasQueuedThreads());
1276 }
1277
1278 /**
1279 * hasQueuedThread(null) throws NPE
1280 */
1281 public void testHasQueuedThreadNPE() { testHasQueuedThreadNPE(false); }
1282 public void testHasQueuedThreadNPE_fair() { testHasQueuedThreadNPE(true); }
1283 public void testHasQueuedThreadNPE(boolean fair) {
1284 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1285 try {
1286 lock.hasQueuedThread(null);
1287 shouldThrow();
1288 } catch (NullPointerException success) {}
1289 }
1290
1291 /**
1292 * hasQueuedThread reports whether a thread is queued
1293 */
1294 public void testHasQueuedThread() { testHasQueuedThread(false); }
1295 public void testHasQueuedThread_fair() { testHasQueuedThread(true); }
1296 public void testHasQueuedThread(boolean fair) {
1297 final PublicReentrantReadWriteLock lock =
1298 new PublicReentrantReadWriteLock(fair);
1299 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1300 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1301 assertFalse(lock.hasQueuedThread(t1));
1302 assertFalse(lock.hasQueuedThread(t2));
1303 lock.writeLock().lock();
1304 t1.start();
1305 waitForQueuedThread(lock, t1);
1306 assertTrue(lock.hasQueuedThread(t1));
1307 assertFalse(lock.hasQueuedThread(t2));
1308 t2.start();
1309 waitForQueuedThread(lock, t2);
1310 assertTrue(lock.hasQueuedThread(t1));
1311 assertTrue(lock.hasQueuedThread(t2));
1312 t1.interrupt();
1313 awaitTermination(t1);
1314 assertFalse(lock.hasQueuedThread(t1));
1315 assertTrue(lock.hasQueuedThread(t2));
1316 lock.writeLock().unlock();
1317 awaitTermination(t2);
1318 assertFalse(lock.hasQueuedThread(t1));
1319 assertFalse(lock.hasQueuedThread(t2));
1320 }
1321
1322 /**
1323 * getQueueLength reports number of waiting threads
1324 */
1325 public void testGetQueueLength() { testGetQueueLength(false); }
1326 public void testGetQueueLength_fair() { testGetQueueLength(true); }
1327 public void testGetQueueLength(boolean fair) {
1328 final PublicReentrantReadWriteLock lock =
1329 new PublicReentrantReadWriteLock(fair);
1330 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1331 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1332 assertEquals(0, lock.getQueueLength());
1333 lock.writeLock().lock();
1334 t1.start();
1335 waitForQueuedThread(lock, t1);
1336 assertEquals(1, lock.getQueueLength());
1337 t2.start();
1338 waitForQueuedThread(lock, t2);
1339 assertEquals(2, lock.getQueueLength());
1340 t1.interrupt();
1341 awaitTermination(t1);
1342 assertEquals(1, lock.getQueueLength());
1343 lock.writeLock().unlock();
1344 awaitTermination(t2);
1345 assertEquals(0, lock.getQueueLength());
1346 }
1347
1348 /**
1349 * getQueuedThreads includes waiting threads
1350 */
1351 public void testGetQueuedThreads() { testGetQueuedThreads(false); }
1352 public void testGetQueuedThreads_fair() { testGetQueuedThreads(true); }
1353 public void testGetQueuedThreads(boolean fair) {
1354 final PublicReentrantReadWriteLock lock =
1355 new PublicReentrantReadWriteLock(fair);
1356 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1357 Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1358 assertTrue(lock.getQueuedThreads().isEmpty());
1359 lock.writeLock().lock();
1360 assertTrue(lock.getQueuedThreads().isEmpty());
1361 t1.start();
1362 waitForQueuedThread(lock, t1);
1363 assertEquals(1, lock.getQueuedThreads().size());
1364 assertTrue(lock.getQueuedThreads().contains(t1));
1365 t2.start();
1366 waitForQueuedThread(lock, t2);
1367 assertEquals(2, lock.getQueuedThreads().size());
1368 assertTrue(lock.getQueuedThreads().contains(t1));
1369 assertTrue(lock.getQueuedThreads().contains(t2));
1370 t1.interrupt();
1371 awaitTermination(t1);
1372 assertFalse(lock.getQueuedThreads().contains(t1));
1373 assertTrue(lock.getQueuedThreads().contains(t2));
1374 assertEquals(1, lock.getQueuedThreads().size());
1375 lock.writeLock().unlock();
1376 awaitTermination(t2);
1377 assertTrue(lock.getQueuedThreads().isEmpty());
1378 }
1379
1380 /**
1381 * hasWaiters throws NPE if null
1382 */
1383 public void testHasWaitersNPE() { testHasWaitersNPE(false); }
1384 public void testHasWaitersNPE_fair() { testHasWaitersNPE(true); }
1385 public void testHasWaitersNPE(boolean fair) {
1386 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1387 try {
1388 lock.hasWaiters(null);
1389 shouldThrow();
1390 } catch (NullPointerException success) {}
1391 }
1392
1393 /**
1394 * getWaitQueueLength throws NPE if null
1395 */
1396 public void testGetWaitQueueLengthNPE() { testGetWaitQueueLengthNPE(false); }
1397 public void testGetWaitQueueLengthNPE_fair() { testGetWaitQueueLengthNPE(true); }
1398 public void testGetWaitQueueLengthNPE(boolean fair) {
1399 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1400 try {
1401 lock.getWaitQueueLength(null);
1402 shouldThrow();
1403 } catch (NullPointerException success) {}
1404 }
1405
1406 /**
1407 * getWaitingThreads throws NPE if null
1408 */
1409 public void testGetWaitingThreadsNPE() { testGetWaitingThreadsNPE(false); }
1410 public void testGetWaitingThreadsNPE_fair() { testGetWaitingThreadsNPE(true); }
1411 public void testGetWaitingThreadsNPE(boolean fair) {
1412 final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock(fair);
1413 try {
1414 lock.getWaitingThreads(null);
1415 shouldThrow();
1416 } catch (NullPointerException success) {}
1417 }
1418
1419 /**
1420 * hasWaiters throws IllegalArgumentException if not owned
1421 */
1422 public void testHasWaitersIAE() { testHasWaitersIAE(false); }
1423 public void testHasWaitersIAE_fair() { testHasWaitersIAE(true); }
1424 public void testHasWaitersIAE(boolean fair) {
1425 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1426 final Condition c = lock.writeLock().newCondition();
1427 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1428 try {
1429 lock2.hasWaiters(c);
1430 shouldThrow();
1431 } catch (IllegalArgumentException success) {}
1432 }
1433
1434 /**
1435 * hasWaiters throws IllegalMonitorStateException if not locked
1436 */
1437 public void testHasWaitersIMSE() { testHasWaitersIMSE(false); }
1438 public void testHasWaitersIMSE_fair() { testHasWaitersIMSE(true); }
1439 public void testHasWaitersIMSE(boolean fair) {
1440 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1441 final Condition c = lock.writeLock().newCondition();
1442 try {
1443 lock.hasWaiters(c);
1444 shouldThrow();
1445 } catch (IllegalMonitorStateException success) {}
1446 }
1447
1448 /**
1449 * getWaitQueueLength throws IllegalArgumentException if not owned
1450 */
1451 public void testGetWaitQueueLengthIAE() { testGetWaitQueueLengthIAE(false); }
1452 public void testGetWaitQueueLengthIAE_fair() { testGetWaitQueueLengthIAE(true); }
1453 public void testGetWaitQueueLengthIAE(boolean fair) {
1454 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1455 final Condition c = lock.writeLock().newCondition();
1456 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1457 try {
1458 lock2.getWaitQueueLength(c);
1459 shouldThrow();
1460 } catch (IllegalArgumentException success) {}
1461 }
1462
1463 /**
1464 * getWaitQueueLength throws IllegalMonitorStateException if not locked
1465 */
1466 public void testGetWaitQueueLengthIMSE() { testGetWaitQueueLengthIMSE(false); }
1467 public void testGetWaitQueueLengthIMSE_fair() { testGetWaitQueueLengthIMSE(true); }
1468 public void testGetWaitQueueLengthIMSE(boolean fair) {
1469 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1470 final Condition c = lock.writeLock().newCondition();
1471 try {
1472 lock.getWaitQueueLength(c);
1473 shouldThrow();
1474 } catch (IllegalMonitorStateException success) {}
1475 }
1476
1477 /**
1478 * getWaitingThreads throws IllegalArgumentException if not owned
1479 */
1480 public void testGetWaitingThreadsIAE() { testGetWaitingThreadsIAE(false); }
1481 public void testGetWaitingThreadsIAE_fair() { testGetWaitingThreadsIAE(true); }
1482 public void testGetWaitingThreadsIAE(boolean fair) {
1483 final PublicReentrantReadWriteLock lock =
1484 new PublicReentrantReadWriteLock(fair);
1485 final Condition c = lock.writeLock().newCondition();
1486 final PublicReentrantReadWriteLock lock2 =
1487 new PublicReentrantReadWriteLock(fair);
1488 try {
1489 lock2.getWaitingThreads(c);
1490 shouldThrow();
1491 } catch (IllegalArgumentException success) {}
1492 }
1493
1494 /**
1495 * getWaitingThreads throws IllegalMonitorStateException if not locked
1496 */
1497 public void testGetWaitingThreadsIMSE() { testGetWaitingThreadsIMSE(false); }
1498 public void testGetWaitingThreadsIMSE_fair() { testGetWaitingThreadsIMSE(true); }
1499 public void testGetWaitingThreadsIMSE(boolean fair) {
1500 final PublicReentrantReadWriteLock lock =
1501 new PublicReentrantReadWriteLock(fair);
1502 final Condition c = lock.writeLock().newCondition();
1503 try {
1504 lock.getWaitingThreads(c);
1505 shouldThrow();
1506 } catch (IllegalMonitorStateException success) {}
1507 }
1508
1509 /**
1510 * hasWaiters returns true when a thread is waiting, else false
1511 */
1512 public void testHasWaiters() { testHasWaiters(false); }
1513 public void testHasWaiters_fair() { testHasWaiters(true); }
1514 public void testHasWaiters(boolean fair) {
1515 final PublicReentrantReadWriteLock lock =
1516 new PublicReentrantReadWriteLock(fair);
1517 final Condition c = lock.writeLock().newCondition();
1518 final CountDownLatch locked = new CountDownLatch(1);
1519 Thread t = newStartedThread(new CheckedRunnable() {
1520 public void realRun() throws InterruptedException {
1521 lock.writeLock().lock();
1522 assertHasNoWaiters(lock, c);
1523 assertFalse(lock.hasWaiters(c));
1524 locked.countDown();
1525 c.await();
1526 assertHasNoWaiters(lock, c);
1527 assertFalse(lock.hasWaiters(c));
1528 lock.writeLock().unlock();
1529 }});
1530
1531 await(locked);
1532 lock.writeLock().lock();
1533 assertHasWaiters(lock, c, t);
1534 assertTrue(lock.hasWaiters(c));
1535 c.signal();
1536 assertHasNoWaiters(lock, c);
1537 assertFalse(lock.hasWaiters(c));
1538 lock.writeLock().unlock();
1539 awaitTermination(t);
1540 assertHasNoWaiters(lock, c);
1541 }
1542
1543 /**
1544 * getWaitQueueLength returns number of waiting threads
1545 */
1546 public void testGetWaitQueueLength() { testGetWaitQueueLength(false); }
1547 public void testGetWaitQueueLength_fair() { testGetWaitQueueLength(true); }
1548 public void testGetWaitQueueLength(boolean fair) {
1549 final PublicReentrantReadWriteLock lock =
1550 new PublicReentrantReadWriteLock(fair);
1551 final Condition c = lock.writeLock().newCondition();
1552 final CountDownLatch locked = new CountDownLatch(1);
1553 Thread t = newStartedThread(new CheckedRunnable() {
1554 public void realRun() throws InterruptedException {
1555 lock.writeLock().lock();
1556 assertEquals(0, lock.getWaitQueueLength(c));
1557 locked.countDown();
1558 c.await();
1559 lock.writeLock().unlock();
1560 }});
1561
1562 await(locked);
1563 lock.writeLock().lock();
1564 assertHasWaiters(lock, c, t);
1565 assertEquals(1, lock.getWaitQueueLength(c));
1566 c.signal();
1567 assertHasNoWaiters(lock, c);
1568 assertEquals(0, lock.getWaitQueueLength(c));
1569 lock.writeLock().unlock();
1570 awaitTermination(t);
1571 }
1572
1573 /**
1574 * getWaitingThreads returns only and all waiting threads
1575 */
1576 public void testGetWaitingThreads() { testGetWaitingThreads(false); }
1577 public void testGetWaitingThreads_fair() { testGetWaitingThreads(true); }
1578 public void testGetWaitingThreads(boolean fair) {
1579 final PublicReentrantReadWriteLock lock =
1580 new PublicReentrantReadWriteLock(fair);
1581 final Condition c = lock.writeLock().newCondition();
1582 final CountDownLatch locked1 = new CountDownLatch(1);
1583 final CountDownLatch locked2 = new CountDownLatch(1);
1584 Thread t1 = new Thread(new CheckedRunnable() {
1585 public void realRun() throws InterruptedException {
1586 lock.writeLock().lock();
1587 assertTrue(lock.getWaitingThreads(c).isEmpty());
1588 locked1.countDown();
1589 c.await();
1590 lock.writeLock().unlock();
1591 }});
1592
1593 Thread t2 = new Thread(new CheckedRunnable() {
1594 public void realRun() throws InterruptedException {
1595 lock.writeLock().lock();
1596 assertFalse(lock.getWaitingThreads(c).isEmpty());
1597 locked2.countDown();
1598 c.await();
1599 lock.writeLock().unlock();
1600 }});
1601
1602 lock.writeLock().lock();
1603 assertTrue(lock.getWaitingThreads(c).isEmpty());
1604 lock.writeLock().unlock();
1605
1606 t1.start();
1607 await(locked1);
1608 t2.start();
1609 await(locked2);
1610
1611 lock.writeLock().lock();
1612 assertTrue(lock.hasWaiters(c));
1613 assertTrue(lock.getWaitingThreads(c).contains(t1));
1614 assertTrue(lock.getWaitingThreads(c).contains(t2));
1615 assertEquals(2, lock.getWaitingThreads(c).size());
1616 c.signalAll();
1617 assertHasNoWaiters(lock, c);
1618 lock.writeLock().unlock();
1619
1620 awaitTermination(t1);
1621 awaitTermination(t2);
1622
1623 assertHasNoWaiters(lock, c);
1624 }
1625
1626 /**
1627 * toString indicates current lock state
1628 */
1629 public void testToString() { testToString(false); }
1630 public void testToString_fair() { testToString(true); }
1631 public void testToString(boolean fair) {
1632 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1633 assertTrue(lock.toString().contains("Write locks = 0"));
1634 assertTrue(lock.toString().contains("Read locks = 0"));
1635 lock.writeLock().lock();
1636 assertTrue(lock.toString().contains("Write locks = 1"));
1637 assertTrue(lock.toString().contains("Read locks = 0"));
1638 lock.writeLock().lock();
1639 assertTrue(lock.toString().contains("Write locks = 2"));
1640 assertTrue(lock.toString().contains("Read locks = 0"));
1641 lock.writeLock().unlock();
1642 lock.writeLock().unlock();
1643 lock.readLock().lock();
1644 assertTrue(lock.toString().contains("Write locks = 0"));
1645 assertTrue(lock.toString().contains("Read locks = 1"));
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 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1658 assertTrue(lock.readLock().toString().contains("Read locks = 0"));
1659 lock.readLock().lock();
1660 assertTrue(lock.readLock().toString().contains("Read locks = 1"));
1661 lock.readLock().lock();
1662 assertTrue(lock.readLock().toString().contains("Read locks = 2"));
1663 lock.readLock().unlock();
1664 assertTrue(lock.readLock().toString().contains("Read locks = 1"));
1665 lock.readLock().unlock();
1666 assertTrue(lock.readLock().toString().contains("Read locks = 0"));
1667 }
1668
1669 /**
1670 * writeLock.toString indicates current lock state
1671 */
1672 public void testWriteLockToString() { testWriteLockToString(false); }
1673 public void testWriteLockToString_fair() { testWriteLockToString(true); }
1674 public void testWriteLockToString(boolean fair) {
1675 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1676 assertTrue(lock.writeLock().toString().contains("Unlocked"));
1677 lock.writeLock().lock();
1678 assertTrue(lock.writeLock().toString().contains("Locked by"));
1679 lock.writeLock().unlock();
1680 assertTrue(lock.writeLock().toString().contains("Unlocked"));
1681 }
1682
1683 }