ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/StampedLockTest.java
(Generate patch)

Comparing jsr166/src/test/tck/StampedLockTest.java (file contents):
Revision 1.2 by jsr166, Fri Feb 1 21:44:41 2013 UTC vs.
Revision 1.4 by dl, Wed Mar 20 16:51:11 2013 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines