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