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

Comparing jsr166/src/test/tck/ReentrantReadWriteLockTest.java (file contents):
Revision 1.32 by jsr166, Tue Nov 17 14:18:28 2009 UTC vs.
Revision 1.55 by jsr166, Mon May 2 01:15:26 2011 UTC

# Line 1 | Line 1
1   /*
2   * Written by Doug Lea with assistance from members of JCP JSR-166
3   * Expert Group and released to the public domain, as explained at
4 < * http://creativecommons.org/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
# Line 9 | Line 9
9   import junit.framework.*;
10   import java.util.concurrent.locks.*;
11   import java.util.concurrent.*;
12 + import static java.util.concurrent.TimeUnit.MILLISECONDS;
13   import java.io.*;
14   import java.util.*;
15  
16   public class ReentrantReadWriteLockTest extends JSR166TestCase {
17      public static void main(String[] args) {
18 <        junit.textui.TestRunner.run (suite());
18 >        junit.textui.TestRunner.run(suite());
19      }
20      public static Test suite() {
21 <        return new TestSuite(ReentrantReadWriteLockTest.class);
21 >        return new TestSuite(ReentrantReadWriteLockTest.class);
22      }
23  
24      /**
# Line 58 | Line 59 | public class ReentrantReadWriteLockTest
59      }
60  
61      /**
62 +     * Releases write lock, checking that it had a hold count of 1.
63 +     */
64 +    void releaseWriteLock(ReentrantReadWriteLock lock) {
65 +        ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
66 +        assertTrue(writeLock.isHeldByCurrentThread());
67 +        writeLock.unlock();
68 +        assertFalse(writeLock.isHeldByCurrentThread());
69 +    }
70 +
71 +    /**
72       * Constructor sets given fairness, and is in unlocked state
73       */
74      public void testConstructor() {
75 <        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
75 >        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
76          assertFalse(rl.isFair());
77          assertFalse(rl.isWriteLocked());
78          assertEquals(0, rl.getReadLockCount());
79 <        ReentrantReadWriteLock r2 = new ReentrantReadWriteLock(true);
79 >        ReentrantReadWriteLock r2 = new ReentrantReadWriteLock(true);
80          assertTrue(r2.isFair());
81          assertFalse(r2.isWriteLocked());
82          assertEquals(0, r2.getReadLockCount());
83 <        ReentrantReadWriteLock r3 = new ReentrantReadWriteLock(false);
83 >        ReentrantReadWriteLock r3 = new ReentrantReadWriteLock(false);
84          assertFalse(r3.isFair());
85          assertFalse(r3.isWriteLocked());
86          assertEquals(0, r3.getReadLockCount());
# Line 79 | Line 90 | public class ReentrantReadWriteLockTest
90       * write-locking and read-locking an unlocked lock succeed
91       */
92      public void testLock() {
93 <        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
93 >        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
94          rl.writeLock().lock();
95          assertTrue(rl.isWriteLocked());
96          assertTrue(rl.isWriteLockedByCurrentThread());
# Line 105 | Line 116 | public class ReentrantReadWriteLockTest
116       * locking an unlocked fair lock succeeds
117       */
118      public void testFairLock() {
119 <        ReentrantReadWriteLock rl = new ReentrantReadWriteLock(true);
119 >        ReentrantReadWriteLock rl = new ReentrantReadWriteLock(true);
120          rl.writeLock().lock();
121          assertTrue(rl.isWriteLocked());
122          assertTrue(rl.isWriteLockedByCurrentThread());
# Line 130 | Line 141 | public class ReentrantReadWriteLockTest
141       * getWriteHoldCount returns number of recursive holds
142       */
143      public void testGetWriteHoldCount() {
144 <        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
145 <        for (int i = 1; i <= SIZE; i++) {
146 <            lock.writeLock().lock();
147 <            assertEquals(i,lock.getWriteHoldCount());
148 <        }
149 <        for (int i = SIZE; i > 0; i--) {
150 <            lock.writeLock().unlock();
151 <            assertEquals(i-1,lock.getWriteHoldCount());
152 <        }
144 >        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
145 >        for (int i = 1; i <= SIZE; i++) {
146 >            lock.writeLock().lock();
147 >            assertEquals(i,lock.getWriteHoldCount());
148 >        }
149 >        for (int i = SIZE; i > 0; i--) {
150 >            lock.writeLock().unlock();
151 >            assertEquals(i-1,lock.getWriteHoldCount());
152 >        }
153      }
154  
155      /**
156       * WriteLock.getHoldCount returns number of recursive holds
157       */
158      public void testGetHoldCount() {
159 <        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
160 <        for (int i = 1; i <= SIZE; i++) {
161 <            lock.writeLock().lock();
162 <            assertEquals(i,lock.writeLock().getHoldCount());
163 <        }
164 <        for (int i = SIZE; i > 0; i--) {
165 <            lock.writeLock().unlock();
166 <            assertEquals(i-1,lock.writeLock().getHoldCount());
167 <        }
159 >        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
160 >        for (int i = 1; i <= SIZE; i++) {
161 >            lock.writeLock().lock();
162 >            assertEquals(i,lock.writeLock().getHoldCount());
163 >        }
164 >        for (int i = SIZE; i > 0; i--) {
165 >            lock.writeLock().unlock();
166 >            assertEquals(i-1,lock.writeLock().getHoldCount());
167 >        }
168      }
169  
170      /**
171       * getReadHoldCount returns number of recursive holds
172       */
173      public void testGetReadHoldCount() {
174 <        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
175 <        for (int i = 1; i <= SIZE; i++) {
176 <            lock.readLock().lock();
177 <            assertEquals(i,lock.getReadHoldCount());
178 <        }
179 <        for (int i = SIZE; i > 0; i--) {
180 <            lock.readLock().unlock();
181 <            assertEquals(i-1,lock.getReadHoldCount());
182 <        }
174 >        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
175 >        for (int i = 1; i <= SIZE; i++) {
176 >            lock.readLock().lock();
177 >            assertEquals(i,lock.getReadHoldCount());
178 >        }
179 >        for (int i = SIZE; i > 0; i--) {
180 >            lock.readLock().unlock();
181 >            assertEquals(i-1,lock.getReadHoldCount());
182 >        }
183      }
184  
185  
# Line 176 | Line 187 | public class ReentrantReadWriteLockTest
187       * write-unlocking an unlocked lock throws IllegalMonitorStateException
188       */
189      public void testUnlock_IllegalMonitorStateException() {
190 <        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
191 <        try {
192 <            rl.writeLock().unlock();
193 <            shouldThrow();
194 <        } catch (IllegalMonitorStateException success) {}
190 >        ReentrantReadWriteLock rl = new ReentrantReadWriteLock();
191 >        try {
192 >            rl.writeLock().unlock();
193 >            shouldThrow();
194 >        } catch (IllegalMonitorStateException success) {}
195      }
196  
197  
# Line 188 | Line 199 | public class ReentrantReadWriteLockTest
199       * write-lockInterruptibly is interruptible
200       */
201      public void testWriteLockInterruptibly_Interrupted() throws Exception {
202 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
192 <        Thread t = new Thread(new Runnable() {
193 <                public void run() {
194 <                    try {
195 <                        lock.writeLock().lockInterruptibly();
196 <                        lock.writeLock().unlock();
197 <                        lock.writeLock().lockInterruptibly();
198 <                        lock.writeLock().unlock();
199 <                    } catch (InterruptedException success) {}
200 <                }
201 <            });
202 <
202 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
203          lock.writeLock().lock();
204 <        t.start();
204 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
205 >            public void realRun() throws InterruptedException {
206 >                lock.writeLock().lockInterruptibly();
207 >            }});
208 >
209          Thread.sleep(SHORT_DELAY_MS);
210          t.interrupt();
211 <        Thread.sleep(SHORT_DELAY_MS);
212 <        lock.writeLock().unlock();
209 <        t.join();
211 >        awaitTermination(t, LONG_DELAY_MS);
212 >        releaseWriteLock(lock);
213      }
214  
215      /**
216       * timed write-tryLock is interruptible
217       */
218      public void testWriteTryLock_Interrupted() throws InterruptedException {
219 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
220 <        lock.writeLock().lock();
221 <        Thread t = new Thread(new Runnable() {
222 <                public void run() {
223 <                    try {
224 <                        lock.writeLock().tryLock(1000,TimeUnit.MILLISECONDS);
222 <                    } catch (InterruptedException success) {}
223 <                }
224 <            });
219 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
220 >        lock.writeLock().lock();
221 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
222 >            public void realRun() throws InterruptedException {
223 >                lock.writeLock().tryLock(SMALL_DELAY_MS, MILLISECONDS);
224 >            }});
225  
226 <        t.start();
226 >        Thread.sleep(SHORT_DELAY_MS);
227          t.interrupt();
228 <        lock.writeLock().unlock();
229 <        t.join();
228 >        awaitTermination(t, LONG_DELAY_MS);
229 >        releaseWriteLock(lock);
230      }
231  
232      /**
233       * read-lockInterruptibly is interruptible
234       */
235      public void testReadLockInterruptibly_Interrupted() throws InterruptedException {
236 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
237 <        lock.writeLock().lock();
238 <        Thread t = new Thread(new Runnable() {
239 <                public void run() {
240 <                    try {
241 <                        lock.readLock().lockInterruptibly();
242 <                    } catch (InterruptedException success) {}
243 <                }
244 <            });
236 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
237 >        lock.writeLock().lock();
238 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
239 >            public void realRun() throws InterruptedException {
240 >                lock.readLock().lockInterruptibly();
241 >            }});
242  
246        t.start();
243          Thread.sleep(SHORT_DELAY_MS);
244          t.interrupt();
245 <        Thread.sleep(SHORT_DELAY_MS);
246 <        lock.writeLock().unlock();
251 <        t.join();
245 >        awaitTermination(t, LONG_DELAY_MS);
246 >        releaseWriteLock(lock);
247      }
248  
249      /**
250       * timed read-tryLock is interruptible
251       */
252      public void testReadTryLock_Interrupted() throws InterruptedException {
253 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
254 <        lock.writeLock().lock();
255 <        Thread t = new Thread(new Runnable() {
256 <                public void run() {
257 <                    try {
258 <                        lock.readLock().tryLock(1000,TimeUnit.MILLISECONDS);
264 <                        threadShouldThrow();
265 <                    } catch (InterruptedException success) {}
266 <                }
267 <            });
253 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
254 >        lock.writeLock().lock();
255 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
256 >            public void realRun() throws InterruptedException {
257 >                lock.readLock().tryLock(LONG_DELAY_MS, MILLISECONDS);
258 >            }});
259  
260 <        t.start();
260 >        Thread.sleep(SHORT_DELAY_MS);
261          t.interrupt();
262 <        t.join();
262 >        awaitTermination(t, LONG_DELAY_MS);
263 >        releaseWriteLock(lock);
264      }
265  
266  
# Line 276 | Line 268 | public class ReentrantReadWriteLockTest
268       * write-tryLock fails if locked
269       */
270      public void testWriteTryLockWhenLocked() throws InterruptedException {
271 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
272 <        lock.writeLock().lock();
273 <        Thread t = new Thread(new Runnable() {
274 <                public void run() {
275 <                    threadAssertFalse(lock.writeLock().tryLock());
276 <                }
285 <            });
271 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
272 >        lock.writeLock().lock();
273 >        Thread t = newStartedThread(new CheckedRunnable() {
274 >            public void realRun() {
275 >                assertFalse(lock.writeLock().tryLock());
276 >            }});
277  
278 <        t.start();
279 <        t.join();
289 <        lock.writeLock().unlock();
278 >        awaitTermination(t, LONG_DELAY_MS);
279 >        releaseWriteLock(lock);
280      }
281  
282      /**
283       * read-tryLock fails if locked
284       */
285      public void testReadTryLockWhenLocked() throws InterruptedException {
286 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
287 <        lock.writeLock().lock();
288 <        Thread t = new Thread(new Runnable() {
289 <                public void run() {
290 <                    threadAssertFalse(lock.readLock().tryLock());
291 <                }
302 <            });
286 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
287 >        lock.writeLock().lock();
288 >        Thread t = newStartedThread(new CheckedRunnable() {
289 >            public void realRun() {
290 >                assertFalse(lock.readLock().tryLock());
291 >            }});
292  
293 <        t.start();
294 <        t.join();
306 <        lock.writeLock().unlock();
293 >        awaitTermination(t, LONG_DELAY_MS);
294 >        releaseWriteLock(lock);
295      }
296  
297      /**
298       * Multiple threads can hold a read lock when not write-locked
299       */
300      public void testMultipleReadLocks() throws InterruptedException {
301 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
302 <        lock.readLock().lock();
303 <        Thread t = new Thread(new Runnable() {
304 <                public void run() {
305 <                    threadAssertTrue(lock.readLock().tryLock());
306 <                    lock.readLock().unlock();
307 <                }
320 <            });
301 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
302 >        lock.readLock().lock();
303 >        Thread t = newStartedThread(new CheckedRunnable() {
304 >            public void realRun() {
305 >                assertTrue(lock.readLock().tryLock());
306 >                lock.readLock().unlock();
307 >            }});
308  
309 <        t.start();
323 <        t.join();
309 >        awaitTermination(t, LONG_DELAY_MS);
310          lock.readLock().unlock();
311      }
312  
# Line 328 | Line 314 | public class ReentrantReadWriteLockTest
314       * A writelock succeeds after reading threads unlock
315       */
316      public void testWriteAfterMultipleReadLocks() throws InterruptedException {
317 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
318 <        lock.readLock().lock();
319 <        Thread t1 = new Thread(new Runnable() {
320 <                public void run() {
321 <                    lock.readLock().lock();
322 <                    lock.readLock().unlock();
323 <                }
324 <            });
325 <        Thread t2 = new Thread(new Runnable() {
326 <                public void run() {
327 <                    lock.writeLock().lock();
328 <                    lock.writeLock().unlock();
343 <                }
344 <            });
317 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
318 >        lock.readLock().lock();
319 >        Thread t1 = newStartedThread(new CheckedRunnable() {
320 >            public void realRun() {
321 >                lock.readLock().lock();
322 >                lock.readLock().unlock();
323 >            }});
324 >        Thread t2 = newStartedThread(new CheckedRunnable() {
325 >            public void realRun() {
326 >                lock.writeLock().lock();
327 >                lock.writeLock().unlock();
328 >            }});
329  
346        t1.start();
347        t2.start();
330          Thread.sleep(SHORT_DELAY_MS);
331          lock.readLock().unlock();
332 <        t1.join(MEDIUM_DELAY_MS);
333 <        t2.join(MEDIUM_DELAY_MS);
352 <        assertTrue(!t1.isAlive());
353 <        assertTrue(!t2.isAlive());
332 >        awaitTermination(t1, LONG_DELAY_MS);
333 >        awaitTermination(t2, LONG_DELAY_MS);
334      }
335  
336      /**
337       * Readlocks succeed after a writing thread unlocks
338       */
339      public void testReadAfterWriteLock() throws InterruptedException {
340 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
341 <        lock.writeLock().lock();
342 <        Thread t1 = new Thread(new Runnable() {
343 <                public void run() {
344 <                    lock.readLock().lock();
345 <                    lock.readLock().unlock();
346 <                }
347 <            });
348 <        Thread t2 = new Thread(new Runnable() {
349 <                public void run() {
350 <                    lock.readLock().lock();
351 <                    lock.readLock().unlock();
352 <                }
353 <            });
354 <
355 <        t1.start();
356 <        t2.start();
357 <        Thread.sleep(SHORT_DELAY_MS);
358 <        lock.writeLock().unlock();
379 <        t1.join(MEDIUM_DELAY_MS);
380 <        t2.join(MEDIUM_DELAY_MS);
381 <        assertTrue(!t1.isAlive());
382 <        assertTrue(!t2.isAlive());
340 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
341 >        lock.writeLock().lock();
342 >        Thread t1 = newStartedThread(new CheckedRunnable() {
343 >            public void realRun() {
344 >                lock.readLock().lock();
345 >                lock.readLock().unlock();
346 >            }});
347 >        Thread t2 = newStartedThread(new CheckedRunnable() {
348 >            public void realRun() {
349 >                lock.readLock().lock();
350 >                lock.readLock().unlock();
351 >            }});
352 >
353 >        Thread.sleep(SHORT_DELAY_MS);
354 >        assertTrue(t1.isAlive());
355 >        assertTrue(t2.isAlive());
356 >        releaseWriteLock(lock);
357 >        awaitTermination(t1, LONG_DELAY_MS);
358 >        awaitTermination(t2, LONG_DELAY_MS);
359      }
360  
361      /**
362       * Read trylock succeeds if write locked by current thread
363       */
364      public void testReadHoldingWriteLock() {
365 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
366 <        lock.writeLock().lock();
365 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
366 >        lock.writeLock().lock();
367          assertTrue(lock.readLock().tryLock());
368          lock.readLock().unlock();
369          lock.writeLock().unlock();
# Line 398 | Line 374 | public class ReentrantReadWriteLockTest
374       * other threads are waiting for readlock
375       */
376      public void testReadHoldingWriteLock2() throws InterruptedException {
377 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
378 <        lock.writeLock().lock();
379 <        Thread t1 = new Thread(new Runnable() {
380 <                public void run() {
381 <                    lock.readLock().lock();
382 <                    lock.readLock().unlock();
383 <                }
384 <            });
385 <        Thread t2 = new Thread(new Runnable() {
386 <                public void run() {
387 <                    lock.readLock().lock();
388 <                    lock.readLock().unlock();
413 <                }
414 <            });
377 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
378 >        lock.writeLock().lock();
379 >        Thread t1 = newStartedThread(new CheckedRunnable() {
380 >            public void realRun() {
381 >                lock.readLock().lock();
382 >                lock.readLock().unlock();
383 >            }});
384 >        Thread t2 = newStartedThread(new CheckedRunnable() {
385 >            public void realRun() {
386 >                lock.readLock().lock();
387 >                lock.readLock().unlock();
388 >            }});
389  
416        t1.start();
417        t2.start();
390          lock.readLock().lock();
391          lock.readLock().unlock();
392          Thread.sleep(SHORT_DELAY_MS);
393          lock.readLock().lock();
394          lock.readLock().unlock();
395          lock.writeLock().unlock();
396 <        t1.join(MEDIUM_DELAY_MS);
397 <        t2.join(MEDIUM_DELAY_MS);
426 <        assertTrue(!t1.isAlive());
427 <        assertTrue(!t2.isAlive());
396 >        awaitTermination(t1, LONG_DELAY_MS);
397 >        awaitTermination(t2, LONG_DELAY_MS);
398      }
399  
400      /**
401 <     *  Read lock succeeds if write locked by current thread even if
401 >     * Read lock succeeds if write locked by current thread even if
402       * other threads are waiting for writelock
403       */
404      public void testReadHoldingWriteLock3() throws InterruptedException {
405 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
406 <        lock.writeLock().lock();
407 <        Thread t1 = new Thread(new Runnable() {
408 <                public void run() {
409 <                    lock.writeLock().lock();
410 <                    lock.writeLock().unlock();
411 <                }
412 <            });
413 <        Thread t2 = new Thread(new Runnable() {
414 <                public void run() {
415 <                    lock.writeLock().lock();
416 <                    lock.writeLock().unlock();
447 <                }
448 <            });
405 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
406 >        lock.writeLock().lock();
407 >        Thread t1 = newStartedThread(new CheckedRunnable() {
408 >            public void realRun() {
409 >                lock.writeLock().lock();
410 >                lock.writeLock().unlock();
411 >            }});
412 >        Thread t2 = newStartedThread(new CheckedRunnable() {
413 >            public void realRun() {
414 >                lock.writeLock().lock();
415 >                lock.writeLock().unlock();
416 >            }});
417  
450        t1.start();
451        t2.start();
418          lock.readLock().lock();
419          lock.readLock().unlock();
420          Thread.sleep(SHORT_DELAY_MS);
421          lock.readLock().lock();
422          lock.readLock().unlock();
423          lock.writeLock().unlock();
424 <        t1.join(MEDIUM_DELAY_MS);
425 <        t2.join(MEDIUM_DELAY_MS);
460 <        assertTrue(!t1.isAlive());
461 <        assertTrue(!t2.isAlive());
424 >        awaitTermination(t1, LONG_DELAY_MS);
425 >        awaitTermination(t2, LONG_DELAY_MS);
426      }
427  
428  
429      /**
430 <     *  Write lock succeeds if write locked by current thread even if
430 >     * Write lock succeeds if write locked by current thread even if
431       * other threads are waiting for writelock
432       */
433      public void testWriteHoldingWriteLock4() throws InterruptedException {
434 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
435 <        lock.writeLock().lock();
436 <        Thread t1 = new Thread(new Runnable() {
437 <                public void run() {
438 <                    lock.writeLock().lock();
439 <                    lock.writeLock().unlock();
440 <                }
441 <            });
442 <        Thread t2 = new Thread(new Runnable() {
443 <                public void run() {
444 <                    lock.writeLock().lock();
445 <                    lock.writeLock().unlock();
482 <                }
483 <            });
434 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
435 >        lock.writeLock().lock();
436 >        Thread t1 = newStartedThread(new CheckedRunnable() {
437 >            public void realRun() {
438 >                lock.writeLock().lock();
439 >                lock.writeLock().unlock();
440 >            }});
441 >        Thread t2 = newStartedThread(new CheckedRunnable() {
442 >            public void realRun() {
443 >                lock.writeLock().lock();
444 >                lock.writeLock().unlock();
445 >            }});
446  
485        t1.start();
486        t2.start();
447          lock.writeLock().lock();
448          lock.writeLock().unlock();
449          Thread.sleep(SHORT_DELAY_MS);
450          lock.writeLock().lock();
451          lock.writeLock().unlock();
452          lock.writeLock().unlock();
453 <        t1.join(MEDIUM_DELAY_MS);
454 <        t2.join(MEDIUM_DELAY_MS);
495 <        assertTrue(!t1.isAlive());
496 <        assertTrue(!t2.isAlive());
453 >        awaitTermination(t1, LONG_DELAY_MS);
454 >        awaitTermination(t2, LONG_DELAY_MS);
455      }
456  
457  
# Line 501 | Line 459 | public class ReentrantReadWriteLockTest
459       * Fair Read trylock succeeds if write locked by current thread
460       */
461      public void testReadHoldingWriteLockFair() {
462 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
463 <        lock.writeLock().lock();
462 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
463 >        lock.writeLock().lock();
464          assertTrue(lock.readLock().tryLock());
465          lock.readLock().unlock();
466          lock.writeLock().unlock();
# Line 513 | Line 471 | public class ReentrantReadWriteLockTest
471       * other threads are waiting for readlock
472       */
473      public void testReadHoldingWriteLockFair2() throws InterruptedException {
474 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
475 <        lock.writeLock().lock();
476 <        Thread t1 = new Thread(new Runnable() {
477 <                public void run() {
478 <                    lock.readLock().lock();
479 <                    lock.readLock().unlock();
480 <                }
481 <            });
482 <        Thread t2 = new Thread(new Runnable() {
483 <                public void run() {
484 <                    lock.readLock().lock();
485 <                    lock.readLock().unlock();
528 <                }
529 <            });
474 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
475 >        lock.writeLock().lock();
476 >        Thread t1 = newStartedThread(new CheckedRunnable() {
477 >            public void realRun() {
478 >                lock.readLock().lock();
479 >                lock.readLock().unlock();
480 >            }});
481 >        Thread t2 = newStartedThread(new CheckedRunnable() {
482 >            public void realRun() {
483 >                lock.readLock().lock();
484 >                lock.readLock().unlock();
485 >            }});
486  
531        t1.start();
532        t2.start();
487          lock.readLock().lock();
488          lock.readLock().unlock();
489          Thread.sleep(SHORT_DELAY_MS);
490          lock.readLock().lock();
491          lock.readLock().unlock();
492          lock.writeLock().unlock();
493 <        t1.join(MEDIUM_DELAY_MS);
494 <        t2.join(MEDIUM_DELAY_MS);
541 <        assertTrue(!t1.isAlive());
542 <        assertTrue(!t2.isAlive());
493 >        awaitTermination(t1, LONG_DELAY_MS);
494 >        awaitTermination(t2, LONG_DELAY_MS);
495      }
496  
497  
# Line 548 | Line 500 | public class ReentrantReadWriteLockTest
500       * other threads are waiting for writelock
501       */
502      public void testReadHoldingWriteLockFair3() throws InterruptedException {
503 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
504 <        lock.writeLock().lock();
505 <        Thread t1 = new Thread(new Runnable() {
506 <                public void run() {
507 <                    lock.writeLock().lock();
508 <                    lock.writeLock().unlock();
509 <                }
510 <            });
511 <        Thread t2 = new Thread(new Runnable() {
512 <                public void run() {
513 <                    lock.writeLock().lock();
514 <                    lock.writeLock().unlock();
563 <                }
564 <            });
503 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
504 >        lock.writeLock().lock();
505 >        Thread t1 = newStartedThread(new CheckedRunnable() {
506 >            public void realRun() {
507 >                lock.writeLock().lock();
508 >                lock.writeLock().unlock();
509 >            }});
510 >        Thread t2 = newStartedThread(new CheckedRunnable() {
511 >            public void realRun() {
512 >                lock.writeLock().lock();
513 >                lock.writeLock().unlock();
514 >            }});
515  
566        t1.start();
567        t2.start();
516          lock.readLock().lock();
517          lock.readLock().unlock();
518          Thread.sleep(SHORT_DELAY_MS);
519          lock.readLock().lock();
520          lock.readLock().unlock();
521          lock.writeLock().unlock();
522 <        t1.join(MEDIUM_DELAY_MS);
523 <        t2.join(MEDIUM_DELAY_MS);
576 <        assertTrue(!t1.isAlive());
577 <        assertTrue(!t2.isAlive());
522 >        awaitTermination(t1, LONG_DELAY_MS);
523 >        awaitTermination(t2, LONG_DELAY_MS);
524      }
525  
526  
# Line 583 | Line 529 | public class ReentrantReadWriteLockTest
529       * other threads are waiting for writelock
530       */
531      public void testWriteHoldingWriteLockFair4() throws InterruptedException {
532 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
533 <        lock.writeLock().lock();
534 <        Thread t1 = new Thread(new Runnable() {
535 <                public void run() {
536 <                    lock.writeLock().lock();
537 <                    lock.writeLock().unlock();
538 <                }
539 <            });
540 <        Thread t2 = new Thread(new Runnable() {
541 <                public void run() {
542 <                    lock.writeLock().lock();
543 <                    lock.writeLock().unlock();
598 <                }
599 <            });
532 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
533 >        lock.writeLock().lock();
534 >        Thread t1 = newStartedThread(new CheckedRunnable() {
535 >            public void realRun() {
536 >                lock.writeLock().lock();
537 >                lock.writeLock().unlock();
538 >            }});
539 >        Thread t2 = newStartedThread(new CheckedRunnable() {
540 >            public void realRun() {
541 >                lock.writeLock().lock();
542 >                lock.writeLock().unlock();
543 >            }});
544  
601        t1.start();
602        t2.start();
545          Thread.sleep(SHORT_DELAY_MS);
546          assertTrue(lock.isWriteLockedByCurrentThread());
547 <        assertTrue(lock.getWriteHoldCount() == 1);
547 >        assertEquals(1, lock.getWriteHoldCount());
548          lock.writeLock().lock();
549 <        assertTrue(lock.getWriteHoldCount() == 2);
549 >        assertEquals(2, lock.getWriteHoldCount());
550          lock.writeLock().unlock();
551          lock.writeLock().lock();
552          lock.writeLock().unlock();
553          lock.writeLock().unlock();
554 <        t1.join(MEDIUM_DELAY_MS);
555 <        t2.join(MEDIUM_DELAY_MS);
614 <        assertTrue(!t1.isAlive());
615 <        assertTrue(!t2.isAlive());
554 >        awaitTermination(t1, LONG_DELAY_MS);
555 >        awaitTermination(t2, LONG_DELAY_MS);
556      }
557  
558  
# Line 620 | Line 560 | public class ReentrantReadWriteLockTest
560       * Read tryLock succeeds if readlocked but not writelocked
561       */
562      public void testTryLockWhenReadLocked() throws InterruptedException {
563 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
564 <        lock.readLock().lock();
565 <        Thread t = new Thread(new Runnable() {
566 <                public void run() {
567 <                    threadAssertTrue(lock.readLock().tryLock());
568 <                    lock.readLock().unlock();
569 <                }
630 <            });
563 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
564 >        lock.readLock().lock();
565 >        Thread t = newStartedThread(new CheckedRunnable() {
566 >            public void realRun() {
567 >                assertTrue(lock.readLock().tryLock());
568 >                lock.readLock().unlock();
569 >            }});
570  
571 <        t.start();
633 <        t.join();
571 >        awaitTermination(t, LONG_DELAY_MS);
572          lock.readLock().unlock();
573      }
574  
637
638
575      /**
576       * write tryLock fails when readlocked
577       */
578      public void testWriteTryLockWhenReadLocked() throws InterruptedException {
579 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
580 <        lock.readLock().lock();
581 <        Thread t = new Thread(new Runnable() {
582 <                public void run() {
583 <                    threadAssertFalse(lock.writeLock().tryLock());
584 <                }
649 <            });
579 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
580 >        lock.readLock().lock();
581 >        Thread t = newStartedThread(new CheckedRunnable() {
582 >            public void realRun() {
583 >                assertFalse(lock.writeLock().tryLock());
584 >            }});
585  
586 <        t.start();
652 <        t.join();
586 >        awaitTermination(t, LONG_DELAY_MS);
587          lock.readLock().unlock();
588      }
589  
# Line 658 | Line 592 | public class ReentrantReadWriteLockTest
592       * Fair Read tryLock succeeds if readlocked but not writelocked
593       */
594      public void testTryLockWhenReadLockedFair() throws InterruptedException {
595 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
596 <        lock.readLock().lock();
597 <        Thread t = new Thread(new Runnable() {
598 <                public void run() {
599 <                    threadAssertTrue(lock.readLock().tryLock());
600 <                    lock.readLock().unlock();
601 <                }
668 <            });
595 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
596 >        lock.readLock().lock();
597 >        Thread t = newStartedThread(new CheckedRunnable() {
598 >            public void realRun() {
599 >                assertTrue(lock.readLock().tryLock());
600 >                lock.readLock().unlock();
601 >            }});
602  
603 <        t.start();
671 <        t.join();
603 >        awaitTermination(t, LONG_DELAY_MS);
604          lock.readLock().unlock();
605      }
606  
# Line 678 | Line 610 | public class ReentrantReadWriteLockTest
610       * Fair write tryLock fails when readlocked
611       */
612      public void testWriteTryLockWhenReadLockedFair() throws InterruptedException {
613 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
614 <        lock.readLock().lock();
615 <        Thread t = new Thread(new Runnable() {
616 <                public void run() {
617 <                    threadAssertFalse(lock.writeLock().tryLock());
618 <                }
687 <            });
613 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
614 >        lock.readLock().lock();
615 >        Thread t = newStartedThread(new CheckedRunnable() {
616 >            public void realRun() {
617 >                assertFalse(lock.writeLock().tryLock());
618 >            }});
619  
620 <        t.start();
690 <        t.join();
620 >        awaitTermination(t, LONG_DELAY_MS);
621          lock.readLock().unlock();
622      }
623  
# Line 697 | Line 627 | public class ReentrantReadWriteLockTest
627       * write timed tryLock times out if locked
628       */
629      public void testWriteTryLock_Timeout() throws InterruptedException {
630 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
631 <        lock.writeLock().lock();
632 <        Thread t = new Thread(new Runnable() {
633 <                public void run() {
634 <                    try {
635 <                        threadAssertFalse(lock.writeLock().tryLock(1, TimeUnit.MILLISECONDS));
706 <                    } catch (Exception ex) {
707 <                        threadUnexpectedException();
708 <                    }
709 <                }
710 <            });
630 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
631 >        lock.writeLock().lock();
632 >        Thread t = newStartedThread(new CheckedRunnable() {
633 >            public void realRun() throws InterruptedException {
634 >                assertFalse(lock.writeLock().tryLock(1, MILLISECONDS));
635 >            }});
636  
637 <        t.start();
638 <        t.join();
637 >        awaitTermination(t, LONG_DELAY_MS);
638 >        assertTrue(lock.writeLock().isHeldByCurrentThread());
639          lock.writeLock().unlock();
640      }
641  
# Line 718 | Line 643 | public class ReentrantReadWriteLockTest
643       * read timed tryLock times out if write-locked
644       */
645      public void testReadTryLock_Timeout() throws InterruptedException {
646 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
647 <        lock.writeLock().lock();
648 <        Thread t = new Thread(new Runnable() {
649 <                public void run() {
650 <                    try {
651 <                        threadAssertFalse(lock.readLock().tryLock(1, TimeUnit.MILLISECONDS));
727 <                    } catch (Exception ex) {
728 <                        threadUnexpectedException();
729 <                    }
730 <                }
731 <            });
646 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
647 >        lock.writeLock().lock();
648 >        Thread t = newStartedThread(new CheckedRunnable() {
649 >            public void realRun() throws InterruptedException {
650 >                assertFalse(lock.readLock().tryLock(1, MILLISECONDS));
651 >            }});
652  
653 <        t.start();
654 <        t.join();
653 >        awaitTermination(t, LONG_DELAY_MS);
654 >        assertTrue(lock.writeLock().isHeldByCurrentThread());
655          lock.writeLock().unlock();
656      }
657  
# Line 740 | Line 660 | public class ReentrantReadWriteLockTest
660       * write lockInterruptibly succeeds if lock free else is interruptible
661       */
662      public void testWriteLockInterruptibly() throws InterruptedException {
663 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
663 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
664          lock.writeLock().lockInterruptibly();
665 <        Thread t = new Thread(new Runnable() {
666 <                public void run() {
667 <                    try {
668 <                        lock.writeLock().lockInterruptibly();
749 <                        threadShouldThrow();
750 <                    }
751 <                    catch (InterruptedException success) {
752 <                    }
753 <                }
754 <            });
665 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
666 >            public void realRun() throws InterruptedException {
667 >                lock.writeLock().lockInterruptibly();
668 >            }});
669  
756        t.start();
670          Thread.sleep(SHORT_DELAY_MS);
671          t.interrupt();
672 <        Thread.sleep(SHORT_DELAY_MS);
673 <        t.join();
761 <        lock.writeLock().unlock();
672 >        awaitTermination(t, LONG_DELAY_MS);
673 >        releaseWriteLock(lock);
674      }
675  
676      /**
677 <     *  read lockInterruptibly succeeds if lock free else is interruptible
677 >     * read lockInterruptibly succeeds if lock free else is interruptible
678       */
679      public void testReadLockInterruptibly() throws InterruptedException {
680 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
680 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
681          lock.writeLock().lockInterruptibly();
682 <        Thread t = new Thread(new Runnable() {
683 <                public void run() {
684 <                    try {
685 <                        lock.readLock().lockInterruptibly();
774 <                        threadShouldThrow();
775 <                    }
776 <                    catch (InterruptedException success) {
777 <                    }
778 <                }
779 <            });
682 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
683 >            public void realRun() throws InterruptedException {
684 >                lock.readLock().lockInterruptibly();
685 >            }});
686  
781        t.start();
687          Thread.sleep(SHORT_DELAY_MS);
688          t.interrupt();
689 <        t.join();
690 <        lock.writeLock().unlock();
689 >        awaitTermination(t, LONG_DELAY_MS);
690 >        releaseWriteLock(lock);
691      }
692  
693      /**
694       * Calling await without holding lock throws IllegalMonitorStateException
695       */
696      public void testAwait_IllegalMonitor() throws InterruptedException {
697 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
697 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
698          final Condition c = lock.writeLock().newCondition();
699          try {
700              c.await();
# Line 801 | Line 706 | public class ReentrantReadWriteLockTest
706       * Calling signal without holding lock throws IllegalMonitorStateException
707       */
708      public void testSignal_IllegalMonitor() {
709 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
709 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
710          final Condition c = lock.writeLock().newCondition();
711          try {
712              c.signal();
# Line 813 | Line 718 | public class ReentrantReadWriteLockTest
718       * awaitNanos without a signal times out
719       */
720      public void testAwaitNanos_Timeout() throws InterruptedException {
721 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
721 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
722          final Condition c = lock.writeLock().newCondition();
723  
724          lock.writeLock().lock();
# Line 824 | Line 729 | public class ReentrantReadWriteLockTest
729  
730  
731      /**
732 <     *  timed await without a signal times out
732 >     * timed await without a signal times out
733       */
734 <    public void testAwait_Timeout() {
735 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
734 >    public void testAwait_Timeout() throws InterruptedException {
735 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
736          final Condition c = lock.writeLock().newCondition();
737          lock.writeLock().lock();
738 +        assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
739          lock.writeLock().unlock();
740      }
741  
742      /**
743       * awaitUntil without a signal times out
744       */
745 <    public void testAwaitUntil_Timeout() {
746 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
745 >    public void testAwaitUntil_Timeout() throws InterruptedException {
746 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
747          final Condition c = lock.writeLock().newCondition();
748          lock.writeLock().lock();
749          java.util.Date d = new java.util.Date();
750 +        assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
751          lock.writeLock().unlock();
752      }
753  
# Line 848 | Line 755 | public class ReentrantReadWriteLockTest
755       * await returns when signalled
756       */
757      public void testAwait() throws InterruptedException {
758 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
758 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
759          final Condition c = lock.writeLock().newCondition();
760 <        Thread t = new Thread(new Runnable() {
761 <                public void run() {
762 <                    try {
763 <                        lock.writeLock().lock();
764 <                        c.await();
765 <                        lock.writeLock().unlock();
859 <                    }
860 <                    catch (InterruptedException e) {
861 <                        threadUnexpectedException();
862 <                    }
863 <                }
864 <            });
760 >        Thread t = newStartedThread(new CheckedRunnable() {
761 >            public void realRun() throws InterruptedException {
762 >                lock.writeLock().lock();
763 >                c.await();
764 >                lock.writeLock().unlock();
765 >            }});
766  
866        t.start();
767          Thread.sleep(SHORT_DELAY_MS);
768          lock.writeLock().lock();
769          c.signal();
770          lock.writeLock().unlock();
771 <        t.join(SHORT_DELAY_MS);
872 <        assertFalse(t.isAlive());
771 >        awaitTermination(t, LONG_DELAY_MS);
772      }
773  
774      /** A helper class for uninterruptible wait tests */
# Line 922 | Line 821 | public class ReentrantReadWriteLockTest
821              lock.writeLock().unlock();
822          }
823  
824 <        thread.join();
824 >        awaitTermination(thread, LONG_DELAY_MS);
825          assertTrue(thread.interrupted);
927        assertFalse(thread.isAlive());
826      }
827  
828      /**
829       * await is interruptible
830       */
831      public void testAwait_Interrupt() throws InterruptedException {
832 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
832 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
833          final Condition c = lock.writeLock().newCondition();
834 <        Thread t = new Thread(new Runnable() {
835 <                public void run() {
836 <                    try {
837 <                        lock.writeLock().lock();
838 <                        c.await();
839 <                        lock.writeLock().unlock();
840 <                        threadShouldThrow();
841 <                    }
842 <                    catch (InterruptedException success) {
843 <                    }
844 <                }
845 <            });
846 <
949 <        t.start();
950 <        Thread.sleep(SHORT_DELAY_MS);
834 >        final CountDownLatch locked = new CountDownLatch(1);
835 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
836 >            public void realRun() throws InterruptedException {
837 >                lock.writeLock().lock();
838 >                assertTrue(lock.isWriteLocked());
839 >                locked.countDown();
840 >                try { c.await(); }
841 >                finally { lock.writeLock().unlock(); }
842 >            }});
843 >
844 >        locked.await();
845 >        while (lock.isWriteLocked())
846 >            Thread.yield();
847          t.interrupt();
848 <        t.join(SHORT_DELAY_MS);
849 <        assertFalse(t.isAlive());
848 >        awaitTermination(t, LONG_DELAY_MS);
849 >        assertFalse(lock.isWriteLocked());
850      }
851  
852      /**
853       * awaitNanos is interruptible
854       */
855      public void testAwaitNanos_Interrupt() throws InterruptedException {
856 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
856 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
857          final Condition c = lock.writeLock().newCondition();
858 <        Thread t = new Thread(new Runnable() {
859 <                public void run() {
860 <                    try {
861 <                        lock.writeLock().lock();
862 <                        c.awaitNanos(SHORT_DELAY_MS * 2 * 1000000);
863 <                        lock.writeLock().unlock();
864 <                        threadShouldThrow();
865 <                    }
866 <                    catch (InterruptedException success) {
867 <                    }
868 <                }
869 <            });
870 <
975 <        t.start();
976 <        Thread.sleep(SHORT_DELAY_MS);
858 >        final CountDownLatch locked = new CountDownLatch(1);
859 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
860 >            public void realRun() throws InterruptedException {
861 >                lock.writeLock().lock();
862 >                assertTrue(lock.isWriteLocked());
863 >                locked.countDown();
864 >                try { c.awaitNanos(MILLISECONDS.toNanos(LONG_DELAY_MS)); }
865 >                finally { lock.writeLock().unlock(); }
866 >            }});
867 >
868 >        locked.await();
869 >        while (lock.isWriteLocked())
870 >            Thread.yield();
871          t.interrupt();
872 <        t.join(SHORT_DELAY_MS);
873 <        assertFalse(t.isAlive());
872 >        awaitTermination(t, LONG_DELAY_MS);
873 >        assertFalse(lock.isWriteLocked());
874      }
875  
876      /**
877       * awaitUntil is interruptible
878       */
879      public void testAwaitUntil_Interrupt() throws InterruptedException {
880 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
880 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
881          final Condition c = lock.writeLock().newCondition();
882 <        Thread t = new Thread(new Runnable() {
883 <                public void run() {
884 <                    try {
885 <                        lock.writeLock().lock();
886 <                        java.util.Date d = new java.util.Date();
887 <                        c.awaitUntil(new java.util.Date(d.getTime() + 10000));
888 <                        lock.writeLock().unlock();
889 <                        threadShouldThrow();
890 <                    }
891 <                    catch (InterruptedException success) {
892 <                    }
893 <                }
894 <            });
895 <
1002 <        t.start();
1003 <        Thread.sleep(SHORT_DELAY_MS);
882 >        final CountDownLatch locked = new CountDownLatch(1);
883 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
884 >            public void realRun() throws InterruptedException {
885 >                lock.writeLock().lock();
886 >                assertTrue(lock.isWriteLocked());
887 >                locked.countDown();
888 >                java.util.Date d = new java.util.Date();
889 >                try { c.awaitUntil(new java.util.Date(d.getTime() + 10000)); }
890 >                finally { lock.writeLock().unlock(); }
891 >            }});
892 >
893 >        locked.await();
894 >        while (lock.isWriteLocked())
895 >            Thread.yield();
896          t.interrupt();
897 <        t.join(SHORT_DELAY_MS);
898 <        assertFalse(t.isAlive());
897 >        awaitTermination(t, LONG_DELAY_MS);
898 >        assertFalse(lock.isWriteLocked());
899      }
900  
901      /**
902       * signalAll wakes up all threads
903       */
904      public void testSignalAll() throws InterruptedException {
905 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
905 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
906          final Condition c = lock.writeLock().newCondition();
907 <        Thread t1 = new Thread(new Runnable() {
908 <                public void run() {
909 <                    try {
910 <                        lock.writeLock().lock();
911 <                        c.await();
912 <                        lock.writeLock().unlock();
913 <                    }
914 <                    catch (InterruptedException e) {
915 <                        threadUnexpectedException();
916 <                    }
917 <                }
918 <            });
919 <
1028 <        Thread t2 = new Thread(new Runnable() {
1029 <                public void run() {
1030 <                    try {
1031 <                        lock.writeLock().lock();
1032 <                        c.await();
1033 <                        lock.writeLock().unlock();
1034 <                    }
1035 <                    catch (InterruptedException e) {
1036 <                        threadUnexpectedException();
1037 <                    }
1038 <                }
1039 <            });
907 >        Thread t1 = newStartedThread(new CheckedRunnable() {
908 >            public void realRun() throws InterruptedException {
909 >                lock.writeLock().lock();
910 >                c.await();
911 >                lock.writeLock().unlock();
912 >            }});
913 >
914 >        Thread t2 = newStartedThread(new CheckedRunnable() {
915 >            public void realRun() throws InterruptedException {
916 >                lock.writeLock().lock();
917 >                c.await();
918 >                lock.writeLock().unlock();
919 >            }});
920  
1041        t1.start();
1042        t2.start();
921          Thread.sleep(SHORT_DELAY_MS);
922          lock.writeLock().lock();
923          c.signalAll();
924          lock.writeLock().unlock();
925 <        t1.join(SHORT_DELAY_MS);
926 <        t2.join(SHORT_DELAY_MS);
1049 <        assertFalse(t1.isAlive());
1050 <        assertFalse(t2.isAlive());
925 >        awaitTermination(t1, LONG_DELAY_MS);
926 >        awaitTermination(t2, LONG_DELAY_MS);
927      }
928  
929      /**
# Line 1074 | Line 950 | public class ReentrantReadWriteLockTest
950       * hasQueuedThreads reports whether there are waiting threads
951       */
952      public void testhasQueuedThreads() throws InterruptedException {
953 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
953 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
954          Thread t1 = new Thread(new InterruptedLockRunnable(lock));
955          Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
956          assertFalse(lock.hasQueuedThreads());
# Line 1091 | Line 967 | public class ReentrantReadWriteLockTest
967          lock.writeLock().unlock();
968          Thread.sleep(SHORT_DELAY_MS);
969          assertFalse(lock.hasQueuedThreads());
970 <        t1.join();
971 <        t2.join();
970 >        awaitTermination(t1, LONG_DELAY_MS);
971 >        awaitTermination(t2, LONG_DELAY_MS);
972      }
973  
974      /**
975       * hasQueuedThread(null) throws NPE
976       */
977      public void testHasQueuedThreadNPE() {
978 <        final ReentrantReadWriteLock sync = new ReentrantReadWriteLock();
978 >        final ReentrantReadWriteLock sync = new ReentrantReadWriteLock();
979          try {
980              sync.hasQueuedThread(null);
981              shouldThrow();
982 <        } catch (NullPointerException success) {
1107 <        }
982 >        } catch (NullPointerException success) {}
983      }
984  
985      /**
986       * hasQueuedThread reports whether a thread is queued.
987       */
988      public void testHasQueuedThread() throws InterruptedException {
989 <        final ReentrantReadWriteLock sync = new ReentrantReadWriteLock();
989 >        final ReentrantReadWriteLock sync = new ReentrantReadWriteLock();
990          Thread t1 = new Thread(new InterruptedLockRunnable(sync));
991          Thread t2 = new Thread(new InterruptibleLockRunnable(sync));
992          assertFalse(sync.hasQueuedThread(t1));
# Line 1133 | Line 1008 | public class ReentrantReadWriteLockTest
1008          assertFalse(sync.hasQueuedThread(t1));
1009          Thread.sleep(SHORT_DELAY_MS);
1010          assertFalse(sync.hasQueuedThread(t2));
1011 <        t1.join();
1012 <        t2.join();
1011 >        awaitTermination(t1, LONG_DELAY_MS);
1012 >        awaitTermination(t2, LONG_DELAY_MS);
1013      }
1014  
1015  
# Line 1142 | Line 1017 | public class ReentrantReadWriteLockTest
1017       * getQueueLength reports number of waiting threads
1018       */
1019      public void testGetQueueLength() throws InterruptedException {
1020 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1020 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1021          Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1022          Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1023          assertEquals(0, lock.getQueueLength());
# Line 1159 | Line 1034 | public class ReentrantReadWriteLockTest
1034          lock.writeLock().unlock();
1035          Thread.sleep(SHORT_DELAY_MS);
1036          assertEquals(0, lock.getQueueLength());
1037 <        t1.join();
1038 <        t2.join();
1037 >        awaitTermination(t1, LONG_DELAY_MS);
1038 >        awaitTermination(t2, LONG_DELAY_MS);
1039      }
1040  
1041      /**
1042       * getQueuedThreads includes waiting threads
1043       */
1044      public void testGetQueuedThreads() throws InterruptedException {
1045 <        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1045 >        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1046          Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1047          Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1048          assertTrue(lock.getQueuedThreads().isEmpty());
# Line 1187 | Line 1062 | public class ReentrantReadWriteLockTest
1062          lock.writeLock().unlock();
1063          Thread.sleep(SHORT_DELAY_MS);
1064          assertTrue(lock.getQueuedThreads().isEmpty());
1065 <        t1.join();
1066 <        t2.join();
1065 >        awaitTermination(t1, LONG_DELAY_MS);
1066 >        awaitTermination(t2, LONG_DELAY_MS);
1067      }
1068  
1069      /**
1070       * hasWaiters throws NPE if null
1071       */
1072      public void testHasWaitersNPE() {
1073 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1073 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1074          try {
1075              lock.hasWaiters(null);
1076              shouldThrow();
# Line 1206 | Line 1081 | public class ReentrantReadWriteLockTest
1081       * getWaitQueueLength throws NPE if null
1082       */
1083      public void testGetWaitQueueLengthNPE() {
1084 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1084 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1085          try {
1086              lock.getWaitQueueLength(null);
1087              shouldThrow();
# Line 1218 | Line 1093 | public class ReentrantReadWriteLockTest
1093       * getWaitingThreads throws NPE if null
1094       */
1095      public void testGetWaitingThreadsNPE() {
1096 <        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1096 >        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1097          try {
1098              lock.getWaitingThreads(null);
1099              shouldThrow();
# Line 1229 | Line 1104 | public class ReentrantReadWriteLockTest
1104       * hasWaiters throws IAE if not owned
1105       */
1106      public void testHasWaitersIAE() {
1107 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1107 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1108          final Condition c = lock.writeLock().newCondition();
1109 <        final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
1109 >        final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
1110          try {
1111              lock2.hasWaiters(c);
1112              shouldThrow();
# Line 1242 | Line 1117 | public class ReentrantReadWriteLockTest
1117       * hasWaiters throws IMSE if not locked
1118       */
1119      public void testHasWaitersIMSE() {
1120 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1120 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1121          final Condition c = lock.writeLock().newCondition();
1122          try {
1123              lock.hasWaiters(c);
# Line 1255 | Line 1130 | public class ReentrantReadWriteLockTest
1130       * getWaitQueueLength throws IAE if not owned
1131       */
1132      public void testGetWaitQueueLengthIAE() {
1133 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1133 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1134          final Condition c = lock.writeLock().newCondition();
1135 <        final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
1135 >        final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock();
1136          try {
1137              lock2.getWaitQueueLength(c);
1138              shouldThrow();
# Line 1268 | Line 1143 | public class ReentrantReadWriteLockTest
1143       * getWaitQueueLength throws IMSE if not locked
1144       */
1145      public void testGetWaitQueueLengthIMSE() {
1146 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1146 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1147          final Condition c = lock.writeLock().newCondition();
1148          try {
1149              lock.getWaitQueueLength(c);
# Line 1281 | Line 1156 | public class ReentrantReadWriteLockTest
1156       * getWaitingThreads throws IAE if not owned
1157       */
1158      public void testGetWaitingThreadsIAE() {
1159 <        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1159 >        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1160          final Condition c = lock.writeLock().newCondition();
1161 <        final PublicReentrantReadWriteLock lock2 = new PublicReentrantReadWriteLock();
1161 >        final PublicReentrantReadWriteLock lock2 = new PublicReentrantReadWriteLock();
1162          try {
1163              lock2.getWaitingThreads(c);
1164              shouldThrow();
# Line 1294 | Line 1169 | public class ReentrantReadWriteLockTest
1169       * getWaitingThreads throws IMSE if not locked
1170       */
1171      public void testGetWaitingThreadsIMSE() {
1172 <        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1172 >        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1173          final Condition c = lock.writeLock().newCondition();
1174          try {
1175              lock.getWaitingThreads(c);
# Line 1307 | Line 1182 | public class ReentrantReadWriteLockTest
1182       * hasWaiters returns true when a thread is waiting, else false
1183       */
1184      public void testHasWaiters() throws InterruptedException {
1185 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1185 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1186          final Condition c = lock.writeLock().newCondition();
1187 <        Thread t = new Thread(new Runnable() {
1188 <                public void run() {
1189 <                    try {
1190 <                        lock.writeLock().lock();
1191 <                        threadAssertFalse(lock.hasWaiters(c));
1192 <                        threadAssertEquals(0, lock.getWaitQueueLength(c));
1193 <                        c.await();
1194 <                        lock.writeLock().unlock();
1320 <                    }
1321 <                    catch (InterruptedException e) {
1322 <                        threadUnexpectedException();
1323 <                    }
1324 <                }
1325 <            });
1187 >        Thread t = newStartedThread(new CheckedRunnable() {
1188 >            public void realRun() throws InterruptedException {
1189 >                lock.writeLock().lock();
1190 >                assertFalse(lock.hasWaiters(c));
1191 >                assertEquals(0, lock.getWaitQueueLength(c));
1192 >                c.await();
1193 >                lock.writeLock().unlock();
1194 >            }});
1195  
1327        t.start();
1196          Thread.sleep(SHORT_DELAY_MS);
1197          lock.writeLock().lock();
1198          assertTrue(lock.hasWaiters(c));
# Line 1336 | Line 1204 | public class ReentrantReadWriteLockTest
1204          assertFalse(lock.hasWaiters(c));
1205          assertEquals(0, lock.getWaitQueueLength(c));
1206          lock.writeLock().unlock();
1207 <        t.join(SHORT_DELAY_MS);
1340 <        assertFalse(t.isAlive());
1207 >        awaitTermination(t, LONG_DELAY_MS);
1208      }
1209  
1210      /**
1211       * getWaitQueueLength returns number of waiting threads
1212       */
1213      public void testGetWaitQueueLength() throws InterruptedException {
1214 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1214 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
1215          final Condition c = lock.writeLock().newCondition();
1216 <        Thread t = new Thread(new Runnable() {
1217 <                public void run() {
1218 <                    try {
1219 <                        lock.writeLock().lock();
1220 <                        threadAssertFalse(lock.hasWaiters(c));
1221 <                        threadAssertEquals(0, lock.getWaitQueueLength(c));
1222 <                        c.await();
1223 <                        lock.writeLock().unlock();
1357 <                    }
1358 <                    catch (InterruptedException e) {
1359 <                        threadUnexpectedException();
1360 <                    }
1361 <                }
1362 <            });
1216 >        Thread t = newStartedThread(new CheckedRunnable() {
1217 >            public void realRun() throws InterruptedException {
1218 >                lock.writeLock().lock();
1219 >                assertFalse(lock.hasWaiters(c));
1220 >                assertEquals(0, lock.getWaitQueueLength(c));
1221 >                c.await();
1222 >                lock.writeLock().unlock();
1223 >            }});
1224  
1364        t.start();
1225          Thread.sleep(SHORT_DELAY_MS);
1226          lock.writeLock().lock();
1227          assertTrue(lock.hasWaiters(c));
# Line 1373 | Line 1233 | public class ReentrantReadWriteLockTest
1233          assertFalse(lock.hasWaiters(c));
1234          assertEquals(0, lock.getWaitQueueLength(c));
1235          lock.writeLock().unlock();
1236 <        t.join(SHORT_DELAY_MS);
1377 <        assertFalse(t.isAlive());
1236 >        awaitTermination(t, LONG_DELAY_MS);
1237      }
1238  
1239  
# Line 1382 | Line 1241 | public class ReentrantReadWriteLockTest
1241       * getWaitingThreads returns only and all waiting threads
1242       */
1243      public void testGetWaitingThreads() throws InterruptedException {
1244 <        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1244 >        final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock();
1245          final Condition c = lock.writeLock().newCondition();
1246 <        Thread t1 = new Thread(new Runnable() {
1247 <                public void run() {
1248 <                    try {
1249 <                        lock.writeLock().lock();
1250 <                        threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
1251 <                        c.await();
1252 <                        lock.writeLock().unlock();
1253 <                    }
1254 <                    catch (InterruptedException e) {
1255 <                        threadUnexpectedException();
1256 <                    }
1257 <                }
1258 <            });
1259 <
1260 <        Thread t2 = new Thread(new Runnable() {
1402 <                public void run() {
1403 <                    try {
1404 <                        lock.writeLock().lock();
1405 <                        threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
1406 <                        c.await();
1407 <                        lock.writeLock().unlock();
1408 <                    }
1409 <                    catch (InterruptedException e) {
1410 <                        threadUnexpectedException();
1411 <                    }
1412 <                }
1413 <            });
1246 >        Thread t1 = new Thread(new CheckedRunnable() {
1247 >            public void realRun() throws InterruptedException {
1248 >                lock.writeLock().lock();
1249 >                assertTrue(lock.getWaitingThreads(c).isEmpty());
1250 >                c.await();
1251 >                lock.writeLock().unlock();
1252 >            }});
1253 >
1254 >        Thread t2 = new Thread(new CheckedRunnable() {
1255 >            public void realRun() throws InterruptedException {
1256 >                lock.writeLock().lock();
1257 >                assertFalse(lock.getWaitingThreads(c).isEmpty());
1258 >                c.await();
1259 >                lock.writeLock().unlock();
1260 >            }});
1261  
1262          lock.writeLock().lock();
1263          assertTrue(lock.getWaitingThreads(c).isEmpty());
# Line 1430 | Line 1277 | public class ReentrantReadWriteLockTest
1277          assertFalse(lock.hasWaiters(c));
1278          assertTrue(lock.getWaitingThreads(c).isEmpty());
1279          lock.writeLock().unlock();
1280 <        t1.join(SHORT_DELAY_MS);
1281 <        t2.join(SHORT_DELAY_MS);
1435 <        assertFalse(t1.isAlive());
1436 <        assertFalse(t2.isAlive());
1280 >        awaitTermination(t1, LONG_DELAY_MS);
1281 >        awaitTermination(t2, LONG_DELAY_MS);
1282      }
1283  
1284      /**

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines