ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.59
Committed: Sun May 24 01:42:14 2015 UTC (8 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.58: +1 -1 lines
Log Message:
whitespace

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