ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.60
Committed: Mon May 9 20:00:19 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.59: +445 -405 lines
Log Message:
Run every test in both non-fair and fair modes

File Contents

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