ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.66
Committed: Mon Jul 17 21:01:30 2017 UTC (6 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.65: +1 -0 lines
Log Message:
suppress [WaitNotInLoop] errorprone warning

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