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.34 by jsr166, Tue Nov 17 14:45:32 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();
203 <        Thread t = new Thread(new CheckedInterruptedRunnable() {
202 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
203 >        lock.writeLock().lock();
204 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
205              public void realRun() throws InterruptedException {
206                  lock.writeLock().lockInterruptibly();
195                lock.writeLock().unlock();
196                lock.writeLock().lockInterruptibly();
197                lock.writeLock().unlock();
207              }});
208  
200        lock.writeLock().lock();
201        t.start();
209          Thread.sleep(SHORT_DELAY_MS);
210          t.interrupt();
211 <        Thread.sleep(SHORT_DELAY_MS);
212 <        lock.writeLock().unlock();
206 <        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 CheckedInterruptedRunnable() {
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(1000,TimeUnit.MILLISECONDS);
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 CheckedInterruptedRunnable() {
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  
237        t.start();
243          Thread.sleep(SHORT_DELAY_MS);
244          t.interrupt();
245 <        Thread.sleep(SHORT_DELAY_MS);
246 <        lock.writeLock().unlock();
242 <        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 CheckedInterruptedRunnable() {
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(1000,TimeUnit.MILLISECONDS);
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 263 | 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 <                }
272 <            });
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();
276 <        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 <                }
289 <            });
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();
293 <        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 <                }
307 <            });
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();
310 <        t.join();
309 >        awaitTermination(t, LONG_DELAY_MS);
310          lock.readLock().unlock();
311      }
312  
# Line 315 | 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();
330 <                }
331 <            });
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  
333        t1.start();
334        t2.start();
330          Thread.sleep(SHORT_DELAY_MS);
331          lock.readLock().unlock();
332 <        t1.join(MEDIUM_DELAY_MS);
333 <        t2.join(MEDIUM_DELAY_MS);
339 <        assertTrue(!t1.isAlive());
340 <        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();
359 <                }
360 <            });
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  
362        t1.start();
363        t2.start();
353          Thread.sleep(SHORT_DELAY_MS);
354 <        lock.writeLock().unlock();
355 <        t1.join(MEDIUM_DELAY_MS);
356 <        t2.join(MEDIUM_DELAY_MS);
357 <        assertTrue(!t1.isAlive());
358 <        assertTrue(!t2.isAlive());
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 385 | 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();
400 <                }
401 <            });
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  
403        t1.start();
404        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);
413 <        assertTrue(!t1.isAlive());
414 <        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();
434 <                }
435 <            });
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  
437        t1.start();
438        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);
447 <        assertTrue(!t1.isAlive());
448 <        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();
469 <                }
470 <            });
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  
472        t1.start();
473        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);
482 <        assertTrue(!t1.isAlive());
483 <        assertTrue(!t2.isAlive());
453 >        awaitTermination(t1, LONG_DELAY_MS);
454 >        awaitTermination(t2, LONG_DELAY_MS);
455      }
456  
457  
# Line 488 | 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 500 | 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();
515 <                }
516 <            });
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  
518        t1.start();
519        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);
528 <        assertTrue(!t1.isAlive());
529 <        assertTrue(!t2.isAlive());
493 >        awaitTermination(t1, LONG_DELAY_MS);
494 >        awaitTermination(t2, LONG_DELAY_MS);
495      }
496  
497  
# Line 535 | 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();
550 <                }
551 <            });
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  
553        t1.start();
554        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);
563 <        assertTrue(!t1.isAlive());
564 <        assertTrue(!t2.isAlive());
522 >        awaitTermination(t1, LONG_DELAY_MS);
523 >        awaitTermination(t2, LONG_DELAY_MS);
524      }
525  
526  
# Line 570 | 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();
585 <                }
586 <            });
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  
588        t1.start();
589        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);
601 <        assertTrue(!t1.isAlive());
602 <        assertTrue(!t2.isAlive());
554 >        awaitTermination(t1, LONG_DELAY_MS);
555 >        awaitTermination(t2, LONG_DELAY_MS);
556      }
557  
558  
# Line 607 | 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 <                }
617 <            });
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();
620 <        t.join();
571 >        awaitTermination(t, LONG_DELAY_MS);
572          lock.readLock().unlock();
573      }
574  
624
625
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 <                }
636 <            });
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();
639 <        t.join();
586 >        awaitTermination(t, LONG_DELAY_MS);
587          lock.readLock().unlock();
588      }
589  
# Line 645 | 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 <                }
655 <            });
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();
658 <        t.join();
603 >        awaitTermination(t, LONG_DELAY_MS);
604          lock.readLock().unlock();
605      }
606  
# Line 665 | 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 <                }
674 <            });
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();
677 <        t.join();
620 >        awaitTermination(t, LONG_DELAY_MS);
621          lock.readLock().unlock();
622      }
623  
# Line 684 | 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 CheckedRunnable() {
630 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
631 >        lock.writeLock().lock();
632 >        Thread t = newStartedThread(new CheckedRunnable() {
633              public void realRun() throws InterruptedException {
634 <                threadAssertFalse(lock.writeLock().tryLock(1, TimeUnit.MILLISECONDS));
634 >                assertFalse(lock.writeLock().tryLock(1, MILLISECONDS));
635              }});
636  
637 <        t.start();
695 <        t.join();
637 >        awaitTermination(t, LONG_DELAY_MS);
638          assertTrue(lock.writeLock().isHeldByCurrentThread());
639          lock.writeLock().unlock();
640      }
# Line 701 | 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 CheckedRunnable() {
646 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
647 >        lock.writeLock().lock();
648 >        Thread t = newStartedThread(new CheckedRunnable() {
649              public void realRun() throws InterruptedException {
650 <                threadAssertFalse(lock.readLock().tryLock(1, TimeUnit.MILLISECONDS));
650 >                assertFalse(lock.readLock().tryLock(1, MILLISECONDS));
651              }});
652  
653 <        t.start();
712 <        t.join();
653 >        awaitTermination(t, LONG_DELAY_MS);
654          assertTrue(lock.writeLock().isHeldByCurrentThread());
655          lock.writeLock().unlock();
656      }
# Line 719 | 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 CheckedInterruptedRunnable() {
665 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
666              public void realRun() throws InterruptedException {
667                  lock.writeLock().lockInterruptibly();
668              }});
669  
729        t.start();
670          Thread.sleep(SHORT_DELAY_MS);
671          t.interrupt();
672 <        Thread.sleep(SHORT_DELAY_MS);
673 <        t.join();
734 <        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 CheckedInterruptedRunnable() {
682 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
683              public void realRun() throws InterruptedException {
684                  lock.readLock().lockInterruptibly();
685              }});
686  
748        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 768 | 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 780 | 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 791 | 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() throws InterruptedException {
735 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
735 >        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
736          final Condition c = lock.writeLock().newCondition();
737          lock.writeLock().lock();
738 <        assertFalse(c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
738 >        assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
739          lock.writeLock().unlock();
740      }
741  
# Line 805 | Line 743 | public class ReentrantReadWriteLockTest
743       * awaitUntil without a signal times out
744       */
745      public void testAwaitUntil_Timeout() throws InterruptedException {
746 <        final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
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();
# Line 817 | 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 CheckedRunnable() {
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  
829        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);
835 <        assertFalse(t.isAlive());
771 >        awaitTermination(t, LONG_DELAY_MS);
772      }
773  
774      /** A helper class for uninterruptible wait tests */
# Line 885 | Line 821 | public class ReentrantReadWriteLockTest
821              lock.writeLock().unlock();
822          }
823  
824 <        thread.join();
824 >        awaitTermination(thread, LONG_DELAY_MS);
825          assertTrue(thread.interrupted);
890        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 CheckedInterruptedRunnable() {
834 >        final CountDownLatch locked = new CountDownLatch(1);
835 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
836              public void realRun() throws InterruptedException {
837                  lock.writeLock().lock();
838 <                c.await();
839 <                lock.writeLock().unlock();
838 >                assertTrue(lock.isWriteLocked());
839 >                locked.countDown();
840 >                try { c.await(); }
841 >                finally { lock.writeLock().unlock(); }
842              }});
843  
844 <        t.start();
845 <        Thread.sleep(SHORT_DELAY_MS);
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 CheckedInterruptedRunnable() {
858 >        final CountDownLatch locked = new CountDownLatch(1);
859 >        Thread t = newStartedThread(new CheckedInterruptedRunnable() {
860              public void realRun() throws InterruptedException {
861                  lock.writeLock().lock();
862 <                c.awaitNanos(SHORT_DELAY_MS * 2 * 1000000);
863 <                lock.writeLock().unlock();
862 >                assertTrue(lock.isWriteLocked());
863 >                locked.countDown();
864 >                try { c.awaitNanos(MILLISECONDS.toNanos(LONG_DELAY_MS)); }
865 >                finally { lock.writeLock().unlock(); }
866              }});
867  
868 <        t.start();
869 <        Thread.sleep(SHORT_DELAY_MS);
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 CheckedInterruptedRunnable() {
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 <                c.awaitUntil(new java.util.Date(d.getTime() + 10000));
890 <                lock.writeLock().unlock();
889 >                try { c.awaitUntil(new java.util.Date(d.getTime() + 10000)); }
890 >                finally { lock.writeLock().unlock(); }
891              }});
892  
893 <        t.start();
894 <        Thread.sleep(SHORT_DELAY_MS);
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 CheckedRunnable() {
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 = new Thread(new CheckedRunnable() {
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  
974        t1.start();
975        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);
982 <        assertFalse(t1.isAlive());
983 <        assertFalse(t2.isAlive());
925 >        awaitTermination(t1, LONG_DELAY_MS);
926 >        awaitTermination(t2, LONG_DELAY_MS);
927      }
928  
929      /**
# Line 1007 | 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 1024 | 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();
# Line 1043 | Line 986 | public class ReentrantReadWriteLockTest
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 1065 | 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 1074 | 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 1091 | 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 1119 | 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 1138 | 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 1150 | 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 1161 | 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 1174 | 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 1187 | 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 1200 | 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 1213 | 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 1226 | 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 1239 | 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 CheckedRunnable() {
1187 >        Thread t = newStartedThread(new CheckedRunnable() {
1188              public void realRun() throws InterruptedException {
1189                  lock.writeLock().lock();
1190 <                threadAssertFalse(lock.hasWaiters(c));
1191 <                threadAssertEquals(0, lock.getWaitQueueLength(c));
1190 >                assertFalse(lock.hasWaiters(c));
1191 >                assertEquals(0, lock.getWaitQueueLength(c));
1192                  c.await();
1193                  lock.writeLock().unlock();
1194              }});
1195  
1253        t.start();
1196          Thread.sleep(SHORT_DELAY_MS);
1197          lock.writeLock().lock();
1198          assertTrue(lock.hasWaiters(c));
# Line 1262 | 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);
1266 <        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 CheckedRunnable() {
1216 >        Thread t = newStartedThread(new CheckedRunnable() {
1217              public void realRun() throws InterruptedException {
1218                  lock.writeLock().lock();
1219 <                threadAssertFalse(lock.hasWaiters(c));
1220 <                threadAssertEquals(0, lock.getWaitQueueLength(c));
1219 >                assertFalse(lock.hasWaiters(c));
1220 >                assertEquals(0, lock.getWaitQueueLength(c));
1221                  c.await();
1222                  lock.writeLock().unlock();
1223              }});
1224  
1284        t.start();
1225          Thread.sleep(SHORT_DELAY_MS);
1226          lock.writeLock().lock();
1227          assertTrue(lock.hasWaiters(c));
# Line 1293 | 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);
1297 <        assertFalse(t.isAlive());
1236 >        awaitTermination(t, LONG_DELAY_MS);
1237      }
1238  
1239  
# Line 1302 | 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 CheckedRunnable() {
1246 >        Thread t1 = new Thread(new CheckedRunnable() {
1247              public void realRun() throws InterruptedException {
1248                  lock.writeLock().lock();
1249 <                threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
1249 >                assertTrue(lock.getWaitingThreads(c).isEmpty());
1250                  c.await();
1251                  lock.writeLock().unlock();
1252              }});
1253  
1254 <        Thread t2 = new Thread(new CheckedRunnable() {
1254 >        Thread t2 = new Thread(new CheckedRunnable() {
1255              public void realRun() throws InterruptedException {
1256                  lock.writeLock().lock();
1257 <                threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
1257 >                assertFalse(lock.getWaitingThreads(c).isEmpty());
1258                  c.await();
1259                  lock.writeLock().unlock();
1260              }});
# Line 1338 | 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);
1343 <        assertFalse(t1.isAlive());
1344 <        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