ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.54
Committed: Wed Dec 31 19:05:43 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.53: +11 -5 lines
Log Message:
no wildcard imports

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.12 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.39 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.26 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.54 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.util.Arrays;
12     import java.util.Collection;
13     import java.util.HashSet;
14     import java.util.concurrent.CountDownLatch;
15     import java.util.concurrent.CyclicBarrier;
16 jsr166 1.50 import java.util.concurrent.locks.Condition;
17     import java.util.concurrent.locks.ReentrantLock;
18 jsr166 1.54
19     import junit.framework.AssertionFailedError;
20     import junit.framework.Test;
21     import junit.framework.TestSuite;
22 dl 1.1
23 dl 1.4 public class ReentrantLockTest extends JSR166TestCase {
24 dl 1.1 public static void main(String[] args) {
25 jsr166 1.36 junit.textui.TestRunner.run(suite());
26 dl 1.1 }
27     public static Test suite() {
28 jsr166 1.30 return new TestSuite(ReentrantLockTest.class);
29 dl 1.1 }
30    
31 dl 1.6 /**
32     * A runnable calling lockInterruptibly
33     */
34 jsr166 1.29 class InterruptibleLockRunnable extends CheckedRunnable {
35 dl 1.5 final ReentrantLock lock;
36     InterruptibleLockRunnable(ReentrantLock l) { lock = l; }
37 jsr166 1.29 public void realRun() throws InterruptedException {
38     lock.lockInterruptibly();
39 dl 1.5 }
40     }
41    
42 dl 1.6 /**
43     * A runnable calling lockInterruptibly that expects to be
44     * interrupted
45     */
46 jsr166 1.29 class InterruptedLockRunnable extends CheckedInterruptedRunnable {
47 dl 1.5 final ReentrantLock lock;
48     InterruptedLockRunnable(ReentrantLock l) { lock = l; }
49 jsr166 1.29 public void realRun() throws InterruptedException {
50     lock.lockInterruptibly();
51 dl 1.5 }
52     }
53    
54     /**
55 dl 1.6 * Subclass to expose protected methods
56 dl 1.5 */
57 dl 1.6 static class PublicReentrantLock extends ReentrantLock {
58     PublicReentrantLock() { super(); }
59 jsr166 1.45 PublicReentrantLock(boolean fair) { super(fair); }
60     public Thread getOwner() {
61     return super.getOwner();
62     }
63 jsr166 1.26 public Collection<Thread> getQueuedThreads() {
64     return super.getQueuedThreads();
65 dl 1.5 }
66 jsr166 1.26 public Collection<Thread> getWaitingThreads(Condition c) {
67     return super.getWaitingThreads(c);
68 dl 1.13 }
69 dl 1.5 }
70    
71 dl 1.8 /**
72 jsr166 1.45 * Releases write lock, checking that it had a hold count of 1.
73     */
74     void releaseLock(PublicReentrantLock lock) {
75 jsr166 1.46 assertLockedByMoi(lock);
76 jsr166 1.45 lock.unlock();
77     assertFalse(lock.isHeldByCurrentThread());
78     assertNotLocked(lock);
79     }
80    
81     /**
82     * Spin-waits until lock.hasQueuedThread(t) becomes true.
83     */
84     void waitForQueuedThread(PublicReentrantLock lock, Thread t) {
85     long startTime = System.nanoTime();
86     while (!lock.hasQueuedThread(t)) {
87     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
88 jsr166 1.47 throw new AssertionFailedError("timed out");
89 jsr166 1.45 Thread.yield();
90     }
91     assertTrue(t.isAlive());
92 jsr166 1.52 assertNotSame(t, lock.getOwner());
93 jsr166 1.45 }
94    
95     /**
96     * Checks that lock is not locked.
97     */
98     void assertNotLocked(PublicReentrantLock lock) {
99     assertFalse(lock.isLocked());
100     assertFalse(lock.isHeldByCurrentThread());
101     assertNull(lock.getOwner());
102     assertEquals(0, lock.getHoldCount());
103     }
104    
105     /**
106     * Checks that lock is locked by the given thread.
107     */
108     void assertLockedBy(PublicReentrantLock lock, Thread t) {
109     assertTrue(lock.isLocked());
110     assertSame(t, lock.getOwner());
111     assertEquals(t == Thread.currentThread(),
112     lock.isHeldByCurrentThread());
113     assertEquals(t == Thread.currentThread(),
114     lock.getHoldCount() > 0);
115     }
116    
117     /**
118 jsr166 1.46 * Checks that lock is locked by the current thread.
119     */
120     void assertLockedByMoi(PublicReentrantLock lock) {
121     assertLockedBy(lock, Thread.currentThread());
122     }
123    
124     /**
125 jsr166 1.43 * Checks that condition c has no waiters.
126     */
127     void assertHasNoWaiters(PublicReentrantLock lock, Condition c) {
128     assertHasWaiters(lock, c, new Thread[] {});
129     }
130    
131     /**
132     * Checks that condition c has exactly the given waiter threads.
133     */
134     void assertHasWaiters(PublicReentrantLock lock, Condition c,
135     Thread... threads) {
136     lock.lock();
137     assertEquals(threads.length > 0, lock.hasWaiters(c));
138     assertEquals(threads.length, lock.getWaitQueueLength(c));
139     assertEquals(threads.length == 0, lock.getWaitingThreads(c).isEmpty());
140     assertEquals(threads.length, lock.getWaitingThreads(c).size());
141     assertEquals(new HashSet<Thread>(lock.getWaitingThreads(c)),
142     new HashSet<Thread>(Arrays.asList(threads)));
143     lock.unlock();
144     }
145    
146 jsr166 1.53 enum AwaitMethod { await, awaitTimed, awaitNanos, awaitUntil }
147 jsr166 1.46
148     /**
149     * Awaits condition using the specified AwaitMethod.
150     */
151     void await(Condition c, AwaitMethod awaitMethod)
152     throws InterruptedException {
153 jsr166 1.48 long timeoutMillis = 2 * LONG_DELAY_MS;
154 jsr166 1.46 switch (awaitMethod) {
155     case await:
156     c.await();
157     break;
158 jsr166 1.48 case awaitTimed:
159     assertTrue(c.await(timeoutMillis, MILLISECONDS));
160     break;
161 jsr166 1.46 case awaitNanos:
162 jsr166 1.48 long nanosTimeout = MILLISECONDS.toNanos(timeoutMillis);
163     long nanosRemaining = c.awaitNanos(nanosTimeout);
164 jsr166 1.46 assertTrue(nanosRemaining > 0);
165     break;
166     case awaitUntil:
167 jsr166 1.48 assertTrue(c.awaitUntil(delayedDate(timeoutMillis)));
168 jsr166 1.46 break;
169     }
170     }
171    
172 jsr166 1.43 /**
173 jsr166 1.45 * Constructor sets given fairness, and is in unlocked state
174 dl 1.9 */
175 jsr166 1.26 public void testConstructor() {
176 jsr166 1.45 PublicReentrantLock lock;
177    
178     lock = new PublicReentrantLock();
179     assertFalse(lock.isFair());
180     assertNotLocked(lock);
181    
182     lock = new PublicReentrantLock(true);
183     assertTrue(lock.isFair());
184     assertNotLocked(lock);
185    
186     lock = new PublicReentrantLock(false);
187     assertFalse(lock.isFair());
188     assertNotLocked(lock);
189 dl 1.9 }
190    
191     /**
192 dl 1.6 * locking an unlocked lock succeeds
193     */
194 jsr166 1.46 public void testLock() { testLock(false); }
195     public void testLock_fair() { testLock(true); }
196     public void testLock(boolean fair) {
197     PublicReentrantLock lock = new PublicReentrantLock(fair);
198 jsr166 1.45 lock.lock();
199 jsr166 1.46 assertLockedByMoi(lock);
200 jsr166 1.45 releaseLock(lock);
201 dl 1.6 }
202    
203 dl 1.8 /**
204 dl 1.5 * Unlocking an unlocked lock throws IllegalMonitorStateException
205 dl 1.1 */
206 jsr166 1.46 public void testUnlock_IMSE() { testUnlock_IMSE(false); }
207     public void testUnlock_IMSE_fair() { testUnlock_IMSE(true); }
208     public void testUnlock_IMSE(boolean fair) {
209     ReentrantLock lock = new ReentrantLock(fair);
210 jsr166 1.30 try {
211 jsr166 1.45 lock.unlock();
212 jsr166 1.30 shouldThrow();
213     } catch (IllegalMonitorStateException success) {}
214 dl 1.5 }
215 dl 1.1
216 dl 1.8 /**
217 dl 1.15 * tryLock on an unlocked lock succeeds
218 dl 1.1 */
219 jsr166 1.46 public void testTryLock() { testTryLock(false); }
220     public void testTryLock_fair() { testTryLock(true); }
221     public void testTryLock(boolean fair) {
222     PublicReentrantLock lock = new PublicReentrantLock(fair);
223     assertTrue(lock.tryLock());
224     assertLockedByMoi(lock);
225 jsr166 1.45 assertTrue(lock.tryLock());
226 jsr166 1.46 assertLockedByMoi(lock);
227     lock.unlock();
228 jsr166 1.45 releaseLock(lock);
229 dl 1.6 }
230    
231 dl 1.8 /**
232 dl 1.13 * hasQueuedThreads reports whether there are waiting threads
233     */
234 jsr166 1.46 public void testHasQueuedThreads() { testHasQueuedThreads(false); }
235     public void testHasQueuedThreads_fair() { testHasQueuedThreads(true); }
236     public void testHasQueuedThreads(boolean fair) {
237     final PublicReentrantLock lock = new PublicReentrantLock(fair);
238 dl 1.13 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
239     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
240 jsr166 1.29 assertFalse(lock.hasQueuedThreads());
241     lock.lock();
242 jsr166 1.45 assertFalse(lock.hasQueuedThreads());
243 jsr166 1.29 t1.start();
244 jsr166 1.45 waitForQueuedThread(lock, t1);
245 jsr166 1.29 assertTrue(lock.hasQueuedThreads());
246     t2.start();
247 jsr166 1.45 waitForQueuedThread(lock, t2);
248 jsr166 1.29 assertTrue(lock.hasQueuedThreads());
249     t1.interrupt();
250 jsr166 1.45 awaitTermination(t1);
251 jsr166 1.29 assertTrue(lock.hasQueuedThreads());
252     lock.unlock();
253 jsr166 1.45 awaitTermination(t2);
254 jsr166 1.29 assertFalse(lock.hasQueuedThreads());
255 jsr166 1.26 }
256 dl 1.13
257     /**
258 dl 1.7 * getQueueLength reports number of waiting threads
259 dl 1.1 */
260 jsr166 1.46 public void testGetQueueLength() { testGetQueueLength(false); }
261     public void testGetQueueLength_fair() { testGetQueueLength(true); }
262     public void testGetQueueLength(boolean fair) {
263     final PublicReentrantLock lock = new PublicReentrantLock(fair);
264 dl 1.16 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
265     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
266 jsr166 1.29 assertEquals(0, lock.getQueueLength());
267     lock.lock();
268     t1.start();
269 jsr166 1.45 waitForQueuedThread(lock, t1);
270 jsr166 1.29 assertEquals(1, lock.getQueueLength());
271     t2.start();
272 jsr166 1.45 waitForQueuedThread(lock, t2);
273 jsr166 1.29 assertEquals(2, lock.getQueueLength());
274     t1.interrupt();
275 jsr166 1.45 awaitTermination(t1);
276 jsr166 1.29 assertEquals(1, lock.getQueueLength());
277     lock.unlock();
278 jsr166 1.45 awaitTermination(t2);
279 jsr166 1.29 assertEquals(0, lock.getQueueLength());
280 jsr166 1.26 }
281 dl 1.16
282     /**
283 dl 1.19 * hasQueuedThread(null) throws NPE
284     */
285 jsr166 1.46 public void testHasQueuedThreadNPE() { testHasQueuedThreadNPE(false); }
286     public void testHasQueuedThreadNPE_fair() { testHasQueuedThreadNPE(true); }
287     public void testHasQueuedThreadNPE(boolean fair) {
288     final ReentrantLock lock = new ReentrantLock(fair);
289 dl 1.19 try {
290 jsr166 1.45 lock.hasQueuedThread(null);
291 dl 1.19 shouldThrow();
292 jsr166 1.29 } catch (NullPointerException success) {}
293 dl 1.19 }
294    
295     /**
296 jsr166 1.49 * hasQueuedThread reports whether a thread is queued
297 dl 1.19 */
298 jsr166 1.46 public void testHasQueuedThread() { testHasQueuedThread(false); }
299     public void testHasQueuedThread_fair() { testHasQueuedThread(true); }
300     public void testHasQueuedThread(boolean fair) {
301     final PublicReentrantLock lock = new PublicReentrantLock(fair);
302 jsr166 1.45 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
303     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
304     assertFalse(lock.hasQueuedThread(t1));
305     assertFalse(lock.hasQueuedThread(t2));
306     lock.lock();
307 jsr166 1.29 t1.start();
308 jsr166 1.45 waitForQueuedThread(lock, t1);
309     assertTrue(lock.hasQueuedThread(t1));
310     assertFalse(lock.hasQueuedThread(t2));
311 jsr166 1.29 t2.start();
312 jsr166 1.45 waitForQueuedThread(lock, t2);
313     assertTrue(lock.hasQueuedThread(t1));
314     assertTrue(lock.hasQueuedThread(t2));
315 jsr166 1.29 t1.interrupt();
316 jsr166 1.42 awaitTermination(t1);
317 jsr166 1.45 assertFalse(lock.hasQueuedThread(t1));
318     assertTrue(lock.hasQueuedThread(t2));
319     lock.unlock();
320 jsr166 1.42 awaitTermination(t2);
321 jsr166 1.45 assertFalse(lock.hasQueuedThread(t1));
322     assertFalse(lock.hasQueuedThread(t2));
323 jsr166 1.26 }
324 dl 1.19
325     /**
326 dl 1.5 * getQueuedThreads includes waiting threads
327     */
328 jsr166 1.46 public void testGetQueuedThreads() { testGetQueuedThreads(false); }
329     public void testGetQueuedThreads_fair() { testGetQueuedThreads(true); }
330     public void testGetQueuedThreads(boolean fair) {
331     final PublicReentrantLock lock = new PublicReentrantLock(fair);
332 dl 1.5 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
333     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
334 jsr166 1.29 assertTrue(lock.getQueuedThreads().isEmpty());
335     lock.lock();
336     assertTrue(lock.getQueuedThreads().isEmpty());
337     t1.start();
338 jsr166 1.45 waitForQueuedThread(lock, t1);
339     assertEquals(1, lock.getQueuedThreads().size());
340 jsr166 1.29 assertTrue(lock.getQueuedThreads().contains(t1));
341     t2.start();
342 jsr166 1.45 waitForQueuedThread(lock, t2);
343     assertEquals(2, lock.getQueuedThreads().size());
344 jsr166 1.29 assertTrue(lock.getQueuedThreads().contains(t1));
345     assertTrue(lock.getQueuedThreads().contains(t2));
346     t1.interrupt();
347 jsr166 1.45 awaitTermination(t1);
348 jsr166 1.29 assertFalse(lock.getQueuedThreads().contains(t1));
349     assertTrue(lock.getQueuedThreads().contains(t2));
350 jsr166 1.45 assertEquals(1, lock.getQueuedThreads().size());
351 jsr166 1.29 lock.unlock();
352 jsr166 1.45 awaitTermination(t2);
353 jsr166 1.29 assertTrue(lock.getQueuedThreads().isEmpty());
354 jsr166 1.26 }
355 dl 1.5
356 dl 1.8 /**
357 jsr166 1.49 * timed tryLock is interruptible
358 dl 1.5 */
359 jsr166 1.46 public void testTryLock_Interruptible() { testTryLock_Interruptible(false); }
360     public void testTryLock_Interruptible_fair() { testTryLock_Interruptible(true); }
361     public void testTryLock_Interruptible(boolean fair) {
362     final PublicReentrantLock lock = new PublicReentrantLock(fair);
363 jsr166 1.30 lock.lock();
364 jsr166 1.41 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
365 jsr166 1.29 public void realRun() throws InterruptedException {
366 jsr166 1.45 lock.tryLock(2 * LONG_DELAY_MS, MILLISECONDS);
367 jsr166 1.29 }});
368    
369 jsr166 1.45 waitForQueuedThread(lock, t);
370 jsr166 1.29 t.interrupt();
371 jsr166 1.42 awaitTermination(t);
372 jsr166 1.45 releaseLock(lock);
373 dl 1.1 }
374    
375 dl 1.5 /**
376 jsr166 1.45 * tryLock on a locked lock fails
377 dl 1.5 */
378 jsr166 1.46 public void testTryLockWhenLocked() { testTryLockWhenLocked(false); }
379     public void testTryLockWhenLocked_fair() { testTryLockWhenLocked(true); }
380     public void testTryLockWhenLocked(boolean fair) {
381     final PublicReentrantLock lock = new PublicReentrantLock(fair);
382 jsr166 1.30 lock.lock();
383 jsr166 1.41 Thread t = newStartedThread(new CheckedRunnable() {
384 jsr166 1.29 public void realRun() {
385 jsr166 1.37 assertFalse(lock.tryLock());
386 jsr166 1.29 }});
387    
388 jsr166 1.42 awaitTermination(t);
389 jsr166 1.45 releaseLock(lock);
390 jsr166 1.26 }
391 dl 1.3
392 dl 1.5 /**
393 dl 1.15 * Timed tryLock on a locked lock times out
394 dl 1.5 */
395 jsr166 1.46 public void testTryLock_Timeout() { testTryLock_Timeout(false); }
396     public void testTryLock_Timeout_fair() { testTryLock_Timeout(true); }
397     public void testTryLock_Timeout(boolean fair) {
398     final PublicReentrantLock lock = new PublicReentrantLock(fair);
399 jsr166 1.30 lock.lock();
400 jsr166 1.41 Thread t = newStartedThread(new CheckedRunnable() {
401 jsr166 1.29 public void realRun() throws InterruptedException {
402 jsr166 1.45 long startTime = System.nanoTime();
403     long timeoutMillis = 10;
404     assertFalse(lock.tryLock(timeoutMillis, MILLISECONDS));
405     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
406 jsr166 1.29 }});
407    
408 jsr166 1.42 awaitTermination(t);
409 jsr166 1.45 releaseLock(lock);
410 jsr166 1.26 }
411    
412 dl 1.5 /**
413     * getHoldCount returns number of recursive holds
414     */
415 jsr166 1.46 public void testGetHoldCount() { testGetHoldCount(false); }
416     public void testGetHoldCount_fair() { testGetHoldCount(true); }
417     public void testGetHoldCount(boolean fair) {
418     ReentrantLock lock = new ReentrantLock(fair);
419 jsr166 1.30 for (int i = 1; i <= SIZE; i++) {
420     lock.lock();
421     assertEquals(i, lock.getHoldCount());
422     }
423     for (int i = SIZE; i > 0; i--) {
424     lock.unlock();
425     assertEquals(i-1, lock.getHoldCount());
426     }
427 dl 1.1 }
428 jsr166 1.26
429 dl 1.5 /**
430     * isLocked is true when locked and false when not
431     */
432 jsr166 1.46 public void testIsLocked() { testIsLocked(false); }
433     public void testIsLocked_fair() { testIsLocked(true); }
434     public void testIsLocked(boolean fair) {
435     try {
436     final ReentrantLock lock = new ReentrantLock(fair);
437     assertFalse(lock.isLocked());
438     lock.lock();
439     assertTrue(lock.isLocked());
440     lock.lock();
441     assertTrue(lock.isLocked());
442     lock.unlock();
443     assertTrue(lock.isLocked());
444     lock.unlock();
445     assertFalse(lock.isLocked());
446     final CyclicBarrier barrier = new CyclicBarrier(2);
447     Thread t = newStartedThread(new CheckedRunnable() {
448     public void realRun() throws Exception {
449     lock.lock();
450     assertTrue(lock.isLocked());
451     barrier.await();
452     barrier.await();
453     lock.unlock();
454     }});
455    
456     barrier.await();
457     assertTrue(lock.isLocked());
458     barrier.await();
459     awaitTermination(t);
460     assertFalse(lock.isLocked());
461     } catch (Exception e) {
462     threadUnexpectedException(e);
463     }
464 jsr166 1.26 }
465 dl 1.6
466 dl 1.5 /**
467     * lockInterruptibly succeeds when unlocked, else is interruptible
468     */
469 jsr166 1.46 public void testLockInterruptibly() { testLockInterruptibly(false); }
470     public void testLockInterruptibly_fair() { testLockInterruptibly(true); }
471     public void testLockInterruptibly(boolean fair) {
472     final PublicReentrantLock lock = new PublicReentrantLock(fair);
473     try {
474     lock.lockInterruptibly();
475     } catch (InterruptedException ie) {
476     threadUnexpectedException(ie);
477     }
478     assertLockedByMoi(lock);
479 jsr166 1.41 Thread t = newStartedThread(new InterruptedLockRunnable(lock));
480 jsr166 1.45 waitForQueuedThread(lock, t);
481 jsr166 1.29 t.interrupt();
482     assertTrue(lock.isLocked());
483     assertTrue(lock.isHeldByCurrentThread());
484 jsr166 1.42 awaitTermination(t);
485 jsr166 1.45 releaseLock(lock);
486 dl 1.1 }
487 dl 1.2
488 dl 1.6 /**
489     * Calling await without holding lock throws IllegalMonitorStateException
490     */
491 jsr166 1.46 public void testAwait_IMSE() { testAwait_IMSE(false); }
492     public void testAwait_IMSE_fair() { testAwait_IMSE(true); }
493     public void testAwait_IMSE(boolean fair) {
494     final ReentrantLock lock = new ReentrantLock(fair);
495 dl 1.2 final Condition c = lock.newCondition();
496 jsr166 1.48 for (AwaitMethod awaitMethod : AwaitMethod.values()) {
497     long startTime = System.nanoTime();
498 jsr166 1.46 try {
499 jsr166 1.48 await(c, awaitMethod);
500 jsr166 1.46 shouldThrow();
501 jsr166 1.48 } catch (IllegalMonitorStateException success) {
502     } catch (InterruptedException e) { threadUnexpectedException(e); }
503     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
504 jsr166 1.46 }
505 dl 1.2 }
506    
507 dl 1.6 /**
508     * Calling signal without holding lock throws IllegalMonitorStateException
509     */
510 jsr166 1.46 public void testSignal_IMSE() { testSignal_IMSE(false); }
511     public void testSignal_IMSE_fair() { testSignal_IMSE(true); }
512     public void testSignal_IMSE(boolean fair) {
513     final ReentrantLock lock = new ReentrantLock(fair);
514 dl 1.2 final Condition c = lock.newCondition();
515     try {
516     c.signal();
517 dl 1.6 shouldThrow();
518 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
519 dl 1.2 }
520    
521 dl 1.6 /**
522     * awaitNanos without a signal times out
523     */
524 jsr166 1.46 public void testAwaitNanos_Timeout() { testAwaitNanos_Timeout(false); }
525     public void testAwaitNanos_Timeout_fair() { testAwaitNanos_Timeout(true); }
526     public void testAwaitNanos_Timeout(boolean fair) {
527     try {
528     final ReentrantLock lock = new ReentrantLock(fair);
529     final Condition c = lock.newCondition();
530     lock.lock();
531     long startTime = System.nanoTime();
532     long timeoutMillis = 10;
533     long timeoutNanos = MILLISECONDS.toNanos(timeoutMillis);
534     long nanosRemaining = c.awaitNanos(timeoutNanos);
535     assertTrue(nanosRemaining <= 0);
536     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
537     lock.unlock();
538     } catch (InterruptedException e) {
539     threadUnexpectedException(e);
540     }
541 dl 1.2 }
542    
543 dl 1.6 /**
544 jsr166 1.38 * timed await without a signal times out
545 dl 1.6 */
546 jsr166 1.46 public void testAwait_Timeout() { testAwait_Timeout(false); }
547     public void testAwait_Timeout_fair() { testAwait_Timeout(true); }
548     public void testAwait_Timeout(boolean fair) {
549     try {
550     final ReentrantLock lock = new ReentrantLock(fair);
551     final Condition c = lock.newCondition();
552     lock.lock();
553     long startTime = System.nanoTime();
554     long timeoutMillis = 10;
555     assertFalse(c.await(timeoutMillis, MILLISECONDS));
556     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
557     lock.unlock();
558     } catch (InterruptedException e) {
559     threadUnexpectedException(e);
560     }
561 dl 1.2 }
562    
563 dl 1.6 /**
564     * awaitUntil without a signal times out
565     */
566 jsr166 1.46 public void testAwaitUntil_Timeout() { testAwaitUntil_Timeout(false); }
567     public void testAwaitUntil_Timeout_fair() { testAwaitUntil_Timeout(true); }
568     public void testAwaitUntil_Timeout(boolean fair) {
569     try {
570     final ReentrantLock lock = new ReentrantLock(fair);
571     final Condition c = lock.newCondition();
572     lock.lock();
573     long startTime = System.nanoTime();
574     long timeoutMillis = 10;
575     java.util.Date d = new java.util.Date();
576     assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + timeoutMillis)));
577     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
578     lock.unlock();
579     } catch (InterruptedException e) {
580     threadUnexpectedException(e);
581     }
582 dl 1.2 }
583    
584 dl 1.6 /**
585     * await returns when signalled
586     */
587 jsr166 1.46 public void testAwait() { testAwait(false); }
588     public void testAwait_fair() { testAwait(true); }
589     public void testAwait(boolean fair) {
590     final PublicReentrantLock lock = new PublicReentrantLock(fair);
591 dl 1.13 final Condition c = lock.newCondition();
592 jsr166 1.45 final CountDownLatch locked = new CountDownLatch(1);
593 jsr166 1.41 Thread t = newStartedThread(new CheckedRunnable() {
594 jsr166 1.29 public void realRun() throws InterruptedException {
595     lock.lock();
596 jsr166 1.45 locked.countDown();
597 jsr166 1.29 c.await();
598     lock.unlock();
599     }});
600 dl 1.5
601 jsr166 1.46 await(locked);
602 jsr166 1.29 lock.lock();
603 jsr166 1.45 assertHasWaiters(lock, c, t);
604 jsr166 1.29 c.signal();
605 jsr166 1.45 assertHasNoWaiters(lock, c);
606     assertTrue(t.isAlive());
607 jsr166 1.29 lock.unlock();
608 jsr166 1.42 awaitTermination(t);
609 dl 1.5 }
610    
611 dl 1.6 /**
612 dl 1.14 * hasWaiters throws NPE if null
613     */
614 jsr166 1.46 public void testHasWaitersNPE() { testHasWaitersNPE(false); }
615     public void testHasWaitersNPE_fair() { testHasWaitersNPE(true); }
616     public void testHasWaitersNPE(boolean fair) {
617     final ReentrantLock lock = new ReentrantLock(fair);
618 dl 1.14 try {
619     lock.hasWaiters(null);
620     shouldThrow();
621 jsr166 1.29 } catch (NullPointerException success) {}
622 dl 1.14 }
623    
624     /**
625     * getWaitQueueLength throws NPE if null
626     */
627 jsr166 1.46 public void testGetWaitQueueLengthNPE() { testGetWaitQueueLengthNPE(false); }
628     public void testGetWaitQueueLengthNPE_fair() { testGetWaitQueueLengthNPE(true); }
629     public void testGetWaitQueueLengthNPE(boolean fair) {
630     final ReentrantLock lock = new ReentrantLock(fair);
631 dl 1.14 try {
632     lock.getWaitQueueLength(null);
633     shouldThrow();
634 jsr166 1.29 } catch (NullPointerException success) {}
635 dl 1.14 }
636    
637     /**
638     * getWaitingThreads throws NPE if null
639     */
640 jsr166 1.46 public void testGetWaitingThreadsNPE() { testGetWaitingThreadsNPE(false); }
641     public void testGetWaitingThreadsNPE_fair() { testGetWaitingThreadsNPE(true); }
642     public void testGetWaitingThreadsNPE(boolean fair) {
643     final PublicReentrantLock lock = new PublicReentrantLock(fair);
644 dl 1.14 try {
645     lock.getWaitingThreads(null);
646     shouldThrow();
647 jsr166 1.29 } catch (NullPointerException success) {}
648 dl 1.14 }
649    
650     /**
651 jsr166 1.45 * hasWaiters throws IllegalArgumentException if not owned
652 dl 1.13 */
653 jsr166 1.46 public void testHasWaitersIAE() { testHasWaitersIAE(false); }
654     public void testHasWaitersIAE_fair() { testHasWaitersIAE(true); }
655     public void testHasWaitersIAE(boolean fair) {
656     final ReentrantLock lock = new ReentrantLock(fair);
657 jsr166 1.29 final Condition c = lock.newCondition();
658 jsr166 1.46 final ReentrantLock lock2 = new ReentrantLock(fair);
659 dl 1.13 try {
660     lock2.hasWaiters(c);
661     shouldThrow();
662 jsr166 1.29 } catch (IllegalArgumentException success) {}
663 dl 1.13 }
664    
665     /**
666 jsr166 1.45 * hasWaiters throws IllegalMonitorStateException if not locked
667 dl 1.13 */
668 jsr166 1.46 public void testHasWaitersIMSE() { testHasWaitersIMSE(false); }
669     public void testHasWaitersIMSE_fair() { testHasWaitersIMSE(true); }
670     public void testHasWaitersIMSE(boolean fair) {
671     final ReentrantLock lock = new ReentrantLock(fair);
672 jsr166 1.29 final Condition c = lock.newCondition();
673 dl 1.13 try {
674     lock.hasWaiters(c);
675     shouldThrow();
676 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
677 dl 1.13 }
678    
679     /**
680 jsr166 1.45 * getWaitQueueLength throws IllegalArgumentException if not owned
681 dl 1.13 */
682 jsr166 1.46 public void testGetWaitQueueLengthIAE() { testGetWaitQueueLengthIAE(false); }
683     public void testGetWaitQueueLengthIAE_fair() { testGetWaitQueueLengthIAE(true); }
684     public void testGetWaitQueueLengthIAE(boolean fair) {
685     final ReentrantLock lock = new ReentrantLock(fair);
686 jsr166 1.29 final Condition c = lock.newCondition();
687 jsr166 1.46 final ReentrantLock lock2 = new ReentrantLock(fair);
688 dl 1.13 try {
689     lock2.getWaitQueueLength(c);
690     shouldThrow();
691 jsr166 1.29 } catch (IllegalArgumentException success) {}
692 dl 1.13 }
693    
694     /**
695 jsr166 1.45 * getWaitQueueLength throws IllegalMonitorStateException if not locked
696 dl 1.13 */
697 jsr166 1.46 public void testGetWaitQueueLengthIMSE() { testGetWaitQueueLengthIMSE(false); }
698     public void testGetWaitQueueLengthIMSE_fair() { testGetWaitQueueLengthIMSE(true); }
699     public void testGetWaitQueueLengthIMSE(boolean fair) {
700     final ReentrantLock lock = new ReentrantLock(fair);
701 jsr166 1.29 final Condition c = lock.newCondition();
702 dl 1.13 try {
703     lock.getWaitQueueLength(c);
704     shouldThrow();
705 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
706 dl 1.13 }
707    
708     /**
709 jsr166 1.45 * getWaitingThreads throws IllegalArgumentException if not owned
710 dl 1.13 */
711 jsr166 1.46 public void testGetWaitingThreadsIAE() { testGetWaitingThreadsIAE(false); }
712     public void testGetWaitingThreadsIAE_fair() { testGetWaitingThreadsIAE(true); }
713     public void testGetWaitingThreadsIAE(boolean fair) {
714     final PublicReentrantLock lock = new PublicReentrantLock(fair);
715 jsr166 1.29 final Condition c = lock.newCondition();
716 jsr166 1.46 final PublicReentrantLock lock2 = new PublicReentrantLock(fair);
717 dl 1.13 try {
718     lock2.getWaitingThreads(c);
719     shouldThrow();
720 jsr166 1.29 } catch (IllegalArgumentException success) {}
721 dl 1.13 }
722    
723     /**
724 jsr166 1.45 * getWaitingThreads throws IllegalMonitorStateException if not locked
725 dl 1.13 */
726 jsr166 1.46 public void testGetWaitingThreadsIMSE() { testGetWaitingThreadsIMSE(false); }
727     public void testGetWaitingThreadsIMSE_fair() { testGetWaitingThreadsIMSE(true); }
728     public void testGetWaitingThreadsIMSE(boolean fair) {
729     final PublicReentrantLock lock = new PublicReentrantLock(fair);
730 jsr166 1.29 final Condition c = lock.newCondition();
731 dl 1.13 try {
732     lock.getWaitingThreads(c);
733     shouldThrow();
734 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
735 dl 1.13 }
736    
737     /**
738 dl 1.6 * hasWaiters returns true when a thread is waiting, else false
739     */
740 jsr166 1.46 public void testHasWaiters() { testHasWaiters(false); }
741     public void testHasWaiters_fair() { testHasWaiters(true); }
742     public void testHasWaiters(boolean fair) {
743     final PublicReentrantLock lock = new PublicReentrantLock(fair);
744 dl 1.13 final Condition c = lock.newCondition();
745 jsr166 1.51 final CountDownLatch pleaseSignal = new CountDownLatch(1);
746 jsr166 1.41 Thread t = newStartedThread(new CheckedRunnable() {
747 jsr166 1.29 public void realRun() throws InterruptedException {
748     lock.lock();
749 jsr166 1.45 assertHasNoWaiters(lock, c);
750 jsr166 1.37 assertFalse(lock.hasWaiters(c));
751 jsr166 1.51 pleaseSignal.countDown();
752 jsr166 1.29 c.await();
753 jsr166 1.45 assertHasNoWaiters(lock, c);
754     assertFalse(lock.hasWaiters(c));
755 jsr166 1.29 lock.unlock();
756     }});
757 dl 1.2
758 jsr166 1.51 await(pleaseSignal);
759 jsr166 1.29 lock.lock();
760 jsr166 1.45 assertHasWaiters(lock, c, t);
761 jsr166 1.29 assertTrue(lock.hasWaiters(c));
762     c.signal();
763 jsr166 1.45 assertHasNoWaiters(lock, c);
764 jsr166 1.29 assertFalse(lock.hasWaiters(c));
765     lock.unlock();
766 jsr166 1.42 awaitTermination(t);
767 jsr166 1.45 assertHasNoWaiters(lock, c);
768 dl 1.5 }
769    
770 dl 1.6 /**
771     * getWaitQueueLength returns number of waiting threads
772     */
773 jsr166 1.46 public void testGetWaitQueueLength() { testGetWaitQueueLength(false); }
774     public void testGetWaitQueueLength_fair() { testGetWaitQueueLength(true); }
775     public void testGetWaitQueueLength(boolean fair) {
776     final PublicReentrantLock lock = new PublicReentrantLock(fair);
777 dl 1.13 final Condition c = lock.newCondition();
778 jsr166 1.45 final CountDownLatch locked1 = new CountDownLatch(1);
779     final CountDownLatch locked2 = new CountDownLatch(1);
780     Thread t1 = new Thread(new CheckedRunnable() {
781 jsr166 1.29 public void realRun() throws InterruptedException {
782     lock.lock();
783 jsr166 1.37 assertFalse(lock.hasWaiters(c));
784     assertEquals(0, lock.getWaitQueueLength(c));
785 jsr166 1.45 locked1.countDown();
786 jsr166 1.29 c.await();
787     lock.unlock();
788     }});
789 dl 1.13
790 jsr166 1.45 Thread t2 = new Thread(new CheckedRunnable() {
791 jsr166 1.29 public void realRun() throws InterruptedException {
792     lock.lock();
793 jsr166 1.37 assertTrue(lock.hasWaiters(c));
794     assertEquals(1, lock.getWaitQueueLength(c));
795 jsr166 1.45 locked2.countDown();
796 jsr166 1.29 c.await();
797     lock.unlock();
798     }});
799    
800     lock.lock();
801 jsr166 1.45 assertEquals(0, lock.getWaitQueueLength(c));
802     lock.unlock();
803    
804     t1.start();
805 jsr166 1.46 await(locked1);
806 jsr166 1.45
807     lock.lock();
808     assertHasWaiters(lock, c, t1);
809     assertEquals(1, lock.getWaitQueueLength(c));
810     lock.unlock();
811    
812     t2.start();
813 jsr166 1.46 await(locked2);
814 jsr166 1.45
815     lock.lock();
816     assertHasWaiters(lock, c, t1, t2);
817 jsr166 1.29 assertEquals(2, lock.getWaitQueueLength(c));
818     c.signalAll();
819 jsr166 1.45 assertHasNoWaiters(lock, c);
820 jsr166 1.29 lock.unlock();
821 jsr166 1.45
822 jsr166 1.42 awaitTermination(t1);
823     awaitTermination(t2);
824 jsr166 1.45
825     assertHasNoWaiters(lock, c);
826 dl 1.13 }
827    
828     /**
829     * getWaitingThreads returns only and all waiting threads
830     */
831 jsr166 1.46 public void testGetWaitingThreads() { testGetWaitingThreads(false); }
832     public void testGetWaitingThreads_fair() { testGetWaitingThreads(true); }
833     public void testGetWaitingThreads(boolean fair) {
834     final PublicReentrantLock lock = new PublicReentrantLock(fair);
835 dl 1.13 final Condition c = lock.newCondition();
836 jsr166 1.45 final CountDownLatch locked1 = new CountDownLatch(1);
837     final CountDownLatch locked2 = new CountDownLatch(1);
838 jsr166 1.30 Thread t1 = new Thread(new CheckedRunnable() {
839 jsr166 1.29 public void realRun() throws InterruptedException {
840     lock.lock();
841 jsr166 1.37 assertTrue(lock.getWaitingThreads(c).isEmpty());
842 jsr166 1.45 locked1.countDown();
843 jsr166 1.29 c.await();
844     lock.unlock();
845     }});
846    
847 jsr166 1.30 Thread t2 = new Thread(new CheckedRunnable() {
848 jsr166 1.29 public void realRun() throws InterruptedException {
849     lock.lock();
850 jsr166 1.37 assertFalse(lock.getWaitingThreads(c).isEmpty());
851 jsr166 1.45 locked2.countDown();
852 jsr166 1.29 c.await();
853     lock.unlock();
854     }});
855 dl 1.5
856 jsr166 1.29 lock.lock();
857     assertTrue(lock.getWaitingThreads(c).isEmpty());
858     lock.unlock();
859 jsr166 1.45
860 jsr166 1.29 t1.start();
861 jsr166 1.46 await(locked1);
862 jsr166 1.45
863     lock.lock();
864     assertHasWaiters(lock, c, t1);
865     assertTrue(lock.getWaitingThreads(c).contains(t1));
866     assertFalse(lock.getWaitingThreads(c).contains(t2));
867     assertEquals(1, lock.getWaitingThreads(c).size());
868     lock.unlock();
869    
870 jsr166 1.29 t2.start();
871 jsr166 1.46 await(locked2);
872 jsr166 1.45
873 jsr166 1.29 lock.lock();
874 jsr166 1.45 assertHasWaiters(lock, c, t1, t2);
875 jsr166 1.29 assertTrue(lock.getWaitingThreads(c).contains(t1));
876     assertTrue(lock.getWaitingThreads(c).contains(t2));
877 jsr166 1.45 assertEquals(2, lock.getWaitingThreads(c).size());
878 jsr166 1.29 c.signalAll();
879 jsr166 1.45 assertHasNoWaiters(lock, c);
880 jsr166 1.29 lock.unlock();
881 jsr166 1.45
882 jsr166 1.42 awaitTermination(t1);
883     awaitTermination(t2);
884 jsr166 1.26
885 jsr166 1.45 assertHasNoWaiters(lock, c);
886 dl 1.22 }
887 dl 1.2
888 dl 1.6 /**
889 jsr166 1.51 * awaitUninterruptibly is uninterruptible
890 dl 1.6 */
891 jsr166 1.46 public void testAwaitUninterruptibly() { testAwaitUninterruptibly(false); }
892     public void testAwaitUninterruptibly_fair() { testAwaitUninterruptibly(true); }
893     public void testAwaitUninterruptibly(boolean fair) {
894     final ReentrantLock lock = new ReentrantLock(fair);
895 dl 1.2 final Condition c = lock.newCondition();
896 jsr166 1.51 final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
897    
898     Thread t1 = newStartedThread(new CheckedRunnable() {
899     public void realRun() {
900     // Interrupt before awaitUninterruptibly
901     lock.lock();
902     pleaseInterrupt.countDown();
903     Thread.currentThread().interrupt();
904     c.awaitUninterruptibly();
905     assertTrue(Thread.interrupted());
906     lock.unlock();
907     }});
908    
909     Thread t2 = newStartedThread(new CheckedRunnable() {
910 jsr166 1.45 public void realRun() {
911 jsr166 1.51 // Interrupt during awaitUninterruptibly
912 jsr166 1.45 lock.lock();
913 jsr166 1.51 pleaseInterrupt.countDown();
914 jsr166 1.45 c.awaitUninterruptibly();
915     assertTrue(Thread.interrupted());
916     lock.unlock();
917     }});
918 dl 1.22
919 jsr166 1.51 await(pleaseInterrupt);
920 jsr166 1.45 lock.lock();
921     lock.unlock();
922 jsr166 1.51 t2.interrupt();
923    
924     assertThreadStaysAlive(t1);
925     assertTrue(t2.isAlive());
926    
927 jsr166 1.29 lock.lock();
928 jsr166 1.51 c.signalAll();
929 jsr166 1.45 lock.unlock();
930 jsr166 1.51
931     awaitTermination(t1);
932     awaitTermination(t2);
933 dl 1.2 }
934    
935 dl 1.6 /**
936 jsr166 1.46 * await/awaitNanos/awaitUntil is interruptible
937 dl 1.6 */
938 jsr166 1.46 public void testInterruptible_await() { testInterruptible(false, AwaitMethod.await); }
939     public void testInterruptible_await_fair() { testInterruptible(true, AwaitMethod.await); }
940 jsr166 1.48 public void testInterruptible_awaitTimed() { testInterruptible(false, AwaitMethod.awaitTimed); }
941     public void testInterruptible_awaitTimed_fair() { testInterruptible(true, AwaitMethod.awaitTimed); }
942 jsr166 1.46 public void testInterruptible_awaitNanos() { testInterruptible(false, AwaitMethod.awaitNanos); }
943     public void testInterruptible_awaitNanos_fair() { testInterruptible(true, AwaitMethod.awaitNanos); }
944     public void testInterruptible_awaitUntil() { testInterruptible(false, AwaitMethod.awaitUntil); }
945     public void testInterruptible_awaitUntil_fair() { testInterruptible(true, AwaitMethod.awaitUntil); }
946     public void testInterruptible(boolean fair, final AwaitMethod awaitMethod) {
947     final PublicReentrantLock lock =
948     new PublicReentrantLock(fair);
949 dl 1.2 final Condition c = lock.newCondition();
950 jsr166 1.51 final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
951 jsr166 1.41 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
952 jsr166 1.30 public void realRun() throws InterruptedException {
953 jsr166 1.29 lock.lock();
954 jsr166 1.46 assertLockedByMoi(lock);
955 jsr166 1.43 assertHasNoWaiters(lock, c);
956 jsr166 1.51 pleaseInterrupt.countDown();
957 jsr166 1.43 try {
958 jsr166 1.46 await(c, awaitMethod);
959 jsr166 1.43 } finally {
960 jsr166 1.46 assertLockedByMoi(lock);
961 jsr166 1.43 assertHasNoWaiters(lock, c);
962     lock.unlock();
963     assertFalse(Thread.interrupted());
964     }
965 jsr166 1.29 }});
966    
967 jsr166 1.51 await(pleaseInterrupt);
968 jsr166 1.43 assertHasWaiters(lock, c, t);
969 jsr166 1.29 t.interrupt();
970 jsr166 1.42 awaitTermination(t);
971 jsr166 1.46 assertNotLocked(lock);
972 dl 1.2 }
973    
974 dl 1.6 /**
975 jsr166 1.46 * signalAll wakes up all threads
976 dl 1.6 */
977 jsr166 1.46 public void testSignalAll_await() { testSignalAll(false, AwaitMethod.await); }
978     public void testSignalAll_await_fair() { testSignalAll(true, AwaitMethod.await); }
979 jsr166 1.48 public void testSignalAll_awaitTimed() { testSignalAll(false, AwaitMethod.awaitTimed); }
980     public void testSignalAll_awaitTimed_fair() { testSignalAll(true, AwaitMethod.awaitTimed); }
981 jsr166 1.46 public void testSignalAll_awaitNanos() { testSignalAll(false, AwaitMethod.awaitNanos); }
982     public void testSignalAll_awaitNanos_fair() { testSignalAll(true, AwaitMethod.awaitNanos); }
983     public void testSignalAll_awaitUntil() { testSignalAll(false, AwaitMethod.awaitUntil); }
984     public void testSignalAll_awaitUntil_fair() { testSignalAll(true, AwaitMethod.awaitUntil); }
985     public void testSignalAll(boolean fair, final AwaitMethod awaitMethod) {
986     final PublicReentrantLock lock = new PublicReentrantLock(fair);
987 dl 1.2 final Condition c = lock.newCondition();
988 jsr166 1.51 final CountDownLatch pleaseSignal = new CountDownLatch(2);
989 jsr166 1.46 class Awaiter extends CheckedRunnable {
990 jsr166 1.30 public void realRun() throws InterruptedException {
991 jsr166 1.29 lock.lock();
992 jsr166 1.51 pleaseSignal.countDown();
993 jsr166 1.46 await(c, awaitMethod);
994     lock.unlock();
995     }
996     }
997 jsr166 1.29
998 jsr166 1.46 Thread t1 = newStartedThread(new Awaiter());
999     Thread t2 = newStartedThread(new Awaiter());
1000 dl 1.2
1001 jsr166 1.51 await(pleaseSignal);
1002 jsr166 1.46 lock.lock();
1003     assertHasWaiters(lock, c, t1, t2);
1004     c.signalAll();
1005     assertHasNoWaiters(lock, c);
1006     lock.unlock();
1007     awaitTermination(t1);
1008     awaitTermination(t2);
1009 dl 1.2 }
1010    
1011 dl 1.6 /**
1012 jsr166 1.49 * signal wakes up waiting threads in FIFO order
1013 dl 1.6 */
1014 jsr166 1.46 public void testSignalWakesFifo() { testSignalWakesFifo(false); }
1015     public void testSignalWakesFifo_fair() { testSignalWakesFifo(true); }
1016     public void testSignalWakesFifo(boolean fair) {
1017     final PublicReentrantLock lock =
1018     new PublicReentrantLock(fair);
1019 dl 1.2 final Condition c = lock.newCondition();
1020 jsr166 1.46 final CountDownLatch locked1 = new CountDownLatch(1);
1021     final CountDownLatch locked2 = new CountDownLatch(1);
1022 jsr166 1.41 Thread t1 = newStartedThread(new CheckedRunnable() {
1023 jsr166 1.29 public void realRun() throws InterruptedException {
1024     lock.lock();
1025 jsr166 1.46 locked1.countDown();
1026 jsr166 1.29 c.await();
1027     lock.unlock();
1028     }});
1029    
1030 jsr166 1.46 await(locked1);
1031    
1032 jsr166 1.41 Thread t2 = newStartedThread(new CheckedRunnable() {
1033 jsr166 1.29 public void realRun() throws InterruptedException {
1034     lock.lock();
1035 jsr166 1.46 locked2.countDown();
1036 jsr166 1.29 c.await();
1037     lock.unlock();
1038     }});
1039 dl 1.2
1040 jsr166 1.46 await(locked2);
1041    
1042 jsr166 1.29 lock.lock();
1043 jsr166 1.45 assertHasWaiters(lock, c, t1, t2);
1044 jsr166 1.46 assertFalse(lock.hasQueuedThreads());
1045     c.signal();
1046     assertHasWaiters(lock, c, t2);
1047     assertTrue(lock.hasQueuedThread(t1));
1048     assertFalse(lock.hasQueuedThread(t2));
1049     c.signal();
1050 jsr166 1.45 assertHasNoWaiters(lock, c);
1051 jsr166 1.46 assertTrue(lock.hasQueuedThread(t1));
1052     assertTrue(lock.hasQueuedThread(t2));
1053 jsr166 1.29 lock.unlock();
1054 jsr166 1.42 awaitTermination(t1);
1055     awaitTermination(t2);
1056 dl 1.3 }
1057    
1058 dl 1.6 /**
1059 dl 1.23 * await after multiple reentrant locking preserves lock count
1060     */
1061 jsr166 1.46 public void testAwaitLockCount() { testAwaitLockCount(false); }
1062     public void testAwaitLockCount_fair() { testAwaitLockCount(true); }
1063     public void testAwaitLockCount(boolean fair) {
1064     final PublicReentrantLock lock = new PublicReentrantLock(fair);
1065 dl 1.23 final Condition c = lock.newCondition();
1066 jsr166 1.51 final CountDownLatch pleaseSignal = new CountDownLatch(2);
1067 jsr166 1.41 Thread t1 = newStartedThread(new CheckedRunnable() {
1068 jsr166 1.29 public void realRun() throws InterruptedException {
1069     lock.lock();
1070 jsr166 1.46 assertLockedByMoi(lock);
1071 jsr166 1.37 assertEquals(1, lock.getHoldCount());
1072 jsr166 1.51 pleaseSignal.countDown();
1073 jsr166 1.29 c.await();
1074 jsr166 1.46 assertLockedByMoi(lock);
1075 jsr166 1.37 assertEquals(1, lock.getHoldCount());
1076 jsr166 1.29 lock.unlock();
1077     }});
1078 dl 1.23
1079 jsr166 1.41 Thread t2 = newStartedThread(new CheckedRunnable() {
1080 jsr166 1.29 public void realRun() throws InterruptedException {
1081     lock.lock();
1082     lock.lock();
1083 jsr166 1.46 assertLockedByMoi(lock);
1084 jsr166 1.37 assertEquals(2, lock.getHoldCount());
1085 jsr166 1.51 pleaseSignal.countDown();
1086 jsr166 1.29 c.await();
1087 jsr166 1.46 assertLockedByMoi(lock);
1088 jsr166 1.37 assertEquals(2, lock.getHoldCount());
1089 jsr166 1.29 lock.unlock();
1090     lock.unlock();
1091     }});
1092    
1093 jsr166 1.51 await(pleaseSignal);
1094 jsr166 1.29 lock.lock();
1095 jsr166 1.45 assertHasWaiters(lock, c, t1, t2);
1096     assertEquals(1, lock.getHoldCount());
1097 jsr166 1.29 c.signalAll();
1098 jsr166 1.45 assertHasNoWaiters(lock, c);
1099 jsr166 1.29 lock.unlock();
1100 jsr166 1.42 awaitTermination(t1);
1101     awaitTermination(t2);
1102 dl 1.23 }
1103    
1104     /**
1105 dl 1.6 * A serialized lock deserializes as unlocked
1106     */
1107 jsr166 1.46 public void testSerialization() { testSerialization(false); }
1108     public void testSerialization_fair() { testSerialization(true); }
1109     public void testSerialization(boolean fair) {
1110     ReentrantLock lock = new ReentrantLock(fair);
1111     lock.lock();
1112    
1113     ReentrantLock clone = serialClone(lock);
1114     assertEquals(lock.isFair(), clone.isFair());
1115     assertTrue(lock.isLocked());
1116     assertFalse(clone.isLocked());
1117     assertEquals(1, lock.getHoldCount());
1118     assertEquals(0, clone.getHoldCount());
1119     clone.lock();
1120     clone.lock();
1121     assertTrue(clone.isLocked());
1122     assertEquals(2, clone.getHoldCount());
1123     assertEquals(1, lock.getHoldCount());
1124     clone.unlock();
1125     clone.unlock();
1126     assertTrue(lock.isLocked());
1127     assertFalse(clone.isLocked());
1128 dl 1.2 }
1129 dl 1.1
1130 dl 1.18 /**
1131     * toString indicates current lock state
1132     */
1133 jsr166 1.46 public void testToString() { testToString(false); }
1134     public void testToString_fair() { testToString(true); }
1135     public void testToString(boolean fair) {
1136     ReentrantLock lock = new ReentrantLock(fair);
1137 jsr166 1.49 assertTrue(lock.toString().contains("Unlocked"));
1138 dl 1.18 lock.lock();
1139 jsr166 1.49 assertTrue(lock.toString().contains("Locked"));
1140     lock.unlock();
1141     assertTrue(lock.toString().contains("Unlocked"));
1142 dl 1.18 }
1143 dl 1.1 }