ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.46
Committed: Fri May 13 21:48:59 2011 UTC (13 years ago) by jsr166
Branch: MAIN
Changes since 1.45: +365 -290 lines
Log Message:
More cross-pollination of RL and RRWL tests; don't rely on thread.join not returning early

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