ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.67
Committed: Thu May 30 03:28:55 2013 UTC (10 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.66: +1 -1 lines
Log Message:
prefer assertNotSame, assertNotNull to assertTrue

File Contents

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