ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.31
Committed: Sat Nov 21 02:33:20 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.30: +4 -3 lines
Log Message:
import static TimeUnit.MILLISECONDS

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     * http://creativecommons.org/licenses/publicdomain
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.30 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     /**
37     * A runnable calling lockInterruptibly that expects to be
38     * interrupted
39     */
40 jsr166 1.29 class InterruptedLockRunnable extends CheckedInterruptedRunnable {
41 dl 1.5 final ReentrantLock lock;
42     InterruptedLockRunnable(ReentrantLock l) { lock = l; }
43 jsr166 1.29 public void realRun() throws InterruptedException {
44     lock.lockInterruptibly();
45 dl 1.5 }
46     }
47    
48     /**
49 dl 1.6 * Subclass to expose protected methods
50 dl 1.5 */
51 dl 1.6 static class PublicReentrantLock extends ReentrantLock {
52     PublicReentrantLock() { super(); }
53 jsr166 1.26 public Collection<Thread> getQueuedThreads() {
54     return super.getQueuedThreads();
55 dl 1.5 }
56 jsr166 1.26 public Collection<Thread> getWaitingThreads(Condition c) {
57     return super.getWaitingThreads(c);
58 dl 1.13 }
59    
60 dl 1.5
61     }
62    
63 dl 1.8 /**
64 dl 1.9 * Constructor sets given fairness
65     */
66 jsr166 1.26 public void testConstructor() {
67 jsr166 1.29 assertFalse(new ReentrantLock().isFair());
68     assertFalse(new ReentrantLock(false).isFair());
69     assertTrue(new ReentrantLock(true).isFair());
70 dl 1.9 }
71    
72     /**
73 dl 1.6 * locking an unlocked lock succeeds
74     */
75 jsr166 1.26 public void testLock() {
76 jsr166 1.30 ReentrantLock rl = new ReentrantLock();
77 dl 1.6 rl.lock();
78     assertTrue(rl.isLocked());
79     rl.unlock();
80 jsr166 1.29 assertFalse(rl.isLocked());
81 dl 1.6 }
82    
83 dl 1.8 /**
84 dl 1.6 * locking an unlocked fair lock succeeds
85     */
86 jsr166 1.26 public void testFairLock() {
87 jsr166 1.30 ReentrantLock rl = new ReentrantLock(true);
88 dl 1.6 rl.lock();
89     assertTrue(rl.isLocked());
90     rl.unlock();
91     }
92    
93 dl 1.8 /**
94 dl 1.5 * Unlocking an unlocked lock throws IllegalMonitorStateException
95 dl 1.1 */
96 jsr166 1.26 public void testUnlock_IllegalMonitorStateException() {
97 jsr166 1.30 ReentrantLock rl = new ReentrantLock();
98     try {
99     rl.unlock();
100     shouldThrow();
101     } catch (IllegalMonitorStateException success) {}
102 dl 1.5 }
103 dl 1.1
104 dl 1.8 /**
105 dl 1.15 * tryLock on an unlocked lock succeeds
106 dl 1.1 */
107 jsr166 1.26 public void testTryLock() {
108 jsr166 1.30 ReentrantLock rl = new ReentrantLock();
109 dl 1.6 assertTrue(rl.tryLock());
110     assertTrue(rl.isLocked());
111     rl.unlock();
112     }
113    
114 dl 1.1
115 dl 1.8 /**
116 dl 1.13 * hasQueuedThreads reports whether there are waiting threads
117     */
118 jsr166 1.29 public void testhasQueuedThreads() throws InterruptedException {
119 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
120 dl 1.13 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
121     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
122 jsr166 1.29 assertFalse(lock.hasQueuedThreads());
123     lock.lock();
124     t1.start();
125     Thread.sleep(SHORT_DELAY_MS);
126     assertTrue(lock.hasQueuedThreads());
127     t2.start();
128     Thread.sleep(SHORT_DELAY_MS);
129     assertTrue(lock.hasQueuedThreads());
130     t1.interrupt();
131     Thread.sleep(SHORT_DELAY_MS);
132     assertTrue(lock.hasQueuedThreads());
133     lock.unlock();
134     Thread.sleep(SHORT_DELAY_MS);
135     assertFalse(lock.hasQueuedThreads());
136     t1.join();
137     t2.join();
138 jsr166 1.26 }
139 dl 1.13
140     /**
141 dl 1.7 * getQueueLength reports number of waiting threads
142 dl 1.1 */
143 jsr166 1.29 public void testGetQueueLength() throws InterruptedException {
144 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
145 dl 1.5 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
146     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
147 jsr166 1.29 assertEquals(0, lock.getQueueLength());
148     lock.lock();
149     t1.start();
150     Thread.sleep(SHORT_DELAY_MS);
151     assertEquals(1, lock.getQueueLength());
152     t2.start();
153     Thread.sleep(SHORT_DELAY_MS);
154     assertEquals(2, lock.getQueueLength());
155     t1.interrupt();
156     Thread.sleep(SHORT_DELAY_MS);
157     assertEquals(1, lock.getQueueLength());
158     lock.unlock();
159     Thread.sleep(SHORT_DELAY_MS);
160     assertEquals(0, lock.getQueueLength());
161     t1.join();
162     t2.join();
163 jsr166 1.26 }
164 dl 1.5
165 dl 1.8 /**
166 dl 1.16 * getQueueLength reports number of waiting threads
167     */
168 jsr166 1.29 public void testGetQueueLength_fair() throws InterruptedException {
169 jsr166 1.30 final ReentrantLock lock = new ReentrantLock(true);
170 dl 1.16 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
171     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
172 jsr166 1.29 assertEquals(0, lock.getQueueLength());
173     lock.lock();
174     t1.start();
175     Thread.sleep(SHORT_DELAY_MS);
176     assertEquals(1, lock.getQueueLength());
177     t2.start();
178     Thread.sleep(SHORT_DELAY_MS);
179     assertEquals(2, lock.getQueueLength());
180     t1.interrupt();
181     Thread.sleep(SHORT_DELAY_MS);
182     assertEquals(1, lock.getQueueLength());
183     lock.unlock();
184     Thread.sleep(SHORT_DELAY_MS);
185     assertEquals(0, lock.getQueueLength());
186     t1.join();
187     t2.join();
188 jsr166 1.26 }
189 dl 1.16
190     /**
191 dl 1.19 * hasQueuedThread(null) throws NPE
192     */
193 jsr166 1.26 public void testHasQueuedThreadNPE() {
194 jsr166 1.30 final ReentrantLock sync = new ReentrantLock();
195 dl 1.19 try {
196     sync.hasQueuedThread(null);
197     shouldThrow();
198 jsr166 1.29 } catch (NullPointerException success) {}
199 dl 1.19 }
200    
201     /**
202     * hasQueuedThread reports whether a thread is queued.
203     */
204 jsr166 1.29 public void testHasQueuedThread() throws InterruptedException {
205 jsr166 1.30 final ReentrantLock sync = new ReentrantLock();
206 dl 1.19 Thread t1 = new Thread(new InterruptedLockRunnable(sync));
207     Thread t2 = new Thread(new InterruptibleLockRunnable(sync));
208 jsr166 1.29 assertFalse(sync.hasQueuedThread(t1));
209     assertFalse(sync.hasQueuedThread(t2));
210     sync.lock();
211     t1.start();
212     Thread.sleep(SHORT_DELAY_MS);
213     assertTrue(sync.hasQueuedThread(t1));
214     t2.start();
215     Thread.sleep(SHORT_DELAY_MS);
216     assertTrue(sync.hasQueuedThread(t1));
217     assertTrue(sync.hasQueuedThread(t2));
218     t1.interrupt();
219     Thread.sleep(SHORT_DELAY_MS);
220     assertFalse(sync.hasQueuedThread(t1));
221     assertTrue(sync.hasQueuedThread(t2));
222     sync.unlock();
223     Thread.sleep(SHORT_DELAY_MS);
224     assertFalse(sync.hasQueuedThread(t1));
225     Thread.sleep(SHORT_DELAY_MS);
226     assertFalse(sync.hasQueuedThread(t2));
227     t1.join();
228     t2.join();
229 jsr166 1.26 }
230 dl 1.19
231    
232     /**
233 dl 1.5 * getQueuedThreads includes waiting threads
234     */
235 jsr166 1.29 public void testGetQueuedThreads() throws InterruptedException {
236 jsr166 1.30 final PublicReentrantLock lock = new PublicReentrantLock();
237 dl 1.5 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
238     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
239 jsr166 1.29 assertTrue(lock.getQueuedThreads().isEmpty());
240     lock.lock();
241     assertTrue(lock.getQueuedThreads().isEmpty());
242     t1.start();
243     Thread.sleep(SHORT_DELAY_MS);
244     assertTrue(lock.getQueuedThreads().contains(t1));
245     t2.start();
246     Thread.sleep(SHORT_DELAY_MS);
247     assertTrue(lock.getQueuedThreads().contains(t1));
248     assertTrue(lock.getQueuedThreads().contains(t2));
249     t1.interrupt();
250     Thread.sleep(SHORT_DELAY_MS);
251     assertFalse(lock.getQueuedThreads().contains(t1));
252     assertTrue(lock.getQueuedThreads().contains(t2));
253     lock.unlock();
254     Thread.sleep(SHORT_DELAY_MS);
255     assertTrue(lock.getQueuedThreads().isEmpty());
256     t1.join();
257     t2.join();
258 jsr166 1.26 }
259 dl 1.5
260 dl 1.1
261 dl 1.8 /**
262 dl 1.15 * timed tryLock is interruptible.
263 dl 1.5 */
264 jsr166 1.29 public void testInterruptedException2() throws InterruptedException {
265 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
266     lock.lock();
267     Thread t = new Thread(new CheckedInterruptedRunnable() {
268 jsr166 1.29 public void realRun() throws InterruptedException {
269 jsr166 1.31 lock.tryLock(MEDIUM_DELAY_MS,MILLISECONDS);
270 jsr166 1.29 }});
271    
272     t.start();
273     t.interrupt();
274     t.join();
275 dl 1.1 }
276    
277 dl 1.3
278 dl 1.5 /**
279 dl 1.15 * TryLock on a locked lock fails
280 dl 1.5 */
281 jsr166 1.29 public void testTryLockWhenLocked() throws InterruptedException {
282 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
283     lock.lock();
284     Thread t = new Thread(new CheckedRunnable() {
285 jsr166 1.29 public void realRun() {
286     threadAssertFalse(lock.tryLock());
287     }});
288    
289     t.start();
290     t.join();
291     lock.unlock();
292 jsr166 1.26 }
293 dl 1.3
294 dl 1.5 /**
295 dl 1.15 * Timed tryLock on a locked lock times out
296 dl 1.5 */
297 jsr166 1.29 public void testTryLock_Timeout() throws InterruptedException {
298 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
299     lock.lock();
300     Thread t = new Thread(new CheckedRunnable() {
301 jsr166 1.29 public void realRun() throws InterruptedException {
302 jsr166 1.31 threadAssertFalse(lock.tryLock(1, MILLISECONDS));
303 jsr166 1.29 }});
304    
305     t.start();
306     t.join();
307     lock.unlock();
308 jsr166 1.26 }
309    
310 dl 1.5 /**
311     * getHoldCount returns number of recursive holds
312     */
313 dl 1.1 public void testGetHoldCount() {
314 jsr166 1.30 ReentrantLock lock = new ReentrantLock();
315     for (int i = 1; i <= SIZE; i++) {
316     lock.lock();
317     assertEquals(i, lock.getHoldCount());
318     }
319     for (int i = SIZE; i > 0; i--) {
320     lock.unlock();
321     assertEquals(i-1, lock.getHoldCount());
322     }
323 dl 1.1 }
324 jsr166 1.26
325    
326 dl 1.5 /**
327     * isLocked is true when locked and false when not
328     */
329 jsr166 1.29 public void testIsLocked() throws InterruptedException {
330 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
331     lock.lock();
332     assertTrue(lock.isLocked());
333     lock.unlock();
334     assertFalse(lock.isLocked());
335     Thread t = new Thread(new CheckedRunnable() {
336 jsr166 1.29 public void realRun() throws InterruptedException {
337     lock.lock();
338     Thread.sleep(SMALL_DELAY_MS);
339     lock.unlock();
340     }});
341    
342     t.start();
343     Thread.sleep(SHORT_DELAY_MS);
344     assertTrue(lock.isLocked());
345     t.join();
346     assertFalse(lock.isLocked());
347 dl 1.1 }
348    
349    
350 dl 1.8 /**
351 dl 1.6 * lockInterruptibly is interruptible.
352     */
353 jsr166 1.29 public void testLockInterruptibly1() throws InterruptedException {
354 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
355     lock.lock();
356     Thread t = new Thread(new InterruptedLockRunnable(lock));
357 jsr166 1.29 t.start();
358     Thread.sleep(SHORT_DELAY_MS);
359     t.interrupt();
360     Thread.sleep(SHORT_DELAY_MS);
361     lock.unlock();
362     t.join();
363 jsr166 1.26 }
364 dl 1.6
365 dl 1.5 /**
366     * lockInterruptibly succeeds when unlocked, else is interruptible
367     */
368 jsr166 1.29 public void testLockInterruptibly2() throws InterruptedException {
369 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
370 jsr166 1.29 lock.lockInterruptibly();
371 jsr166 1.30 Thread t = new Thread(new InterruptedLockRunnable(lock));
372 jsr166 1.29 t.start();
373     t.interrupt();
374     assertTrue(lock.isLocked());
375     assertTrue(lock.isHeldByCurrentThread());
376     t.join();
377 dl 1.1 }
378 dl 1.2
379 dl 1.6 /**
380     * Calling await without holding lock throws IllegalMonitorStateException
381     */
382 jsr166 1.29 public void testAwait_IllegalMonitor() throws InterruptedException {
383 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
384 dl 1.2 final Condition c = lock.newCondition();
385     try {
386     c.await();
387 dl 1.6 shouldThrow();
388 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
389 dl 1.2 }
390    
391 dl 1.6 /**
392     * Calling signal without holding lock throws IllegalMonitorStateException
393     */
394 dl 1.2 public void testSignal_IllegalMonitor() {
395 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
396 dl 1.2 final Condition c = lock.newCondition();
397     try {
398     c.signal();
399 dl 1.6 shouldThrow();
400 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
401 dl 1.2 }
402    
403 dl 1.6 /**
404     * awaitNanos without a signal times out
405     */
406 jsr166 1.29 public void testAwaitNanos_Timeout() throws InterruptedException {
407 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
408 dl 1.2 final Condition c = lock.newCondition();
409 jsr166 1.29 lock.lock();
410     long t = c.awaitNanos(100);
411     assertTrue(t <= 0);
412     lock.unlock();
413 dl 1.2 }
414    
415 dl 1.6 /**
416     * timed await without a signal times out
417     */
418 jsr166 1.29 public void testAwait_Timeout() throws InterruptedException {
419 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
420 dl 1.2 final Condition c = lock.newCondition();
421 jsr166 1.29 lock.lock();
422 jsr166 1.31 assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
423 jsr166 1.29 lock.unlock();
424 dl 1.2 }
425    
426 dl 1.6 /**
427     * awaitUntil without a signal times out
428     */
429 jsr166 1.29 public void testAwaitUntil_Timeout() throws InterruptedException {
430 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
431 dl 1.2 final Condition c = lock.newCondition();
432 jsr166 1.29 lock.lock();
433     java.util.Date d = new java.util.Date();
434     assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
435     lock.unlock();
436 dl 1.2 }
437    
438 dl 1.6 /**
439     * await returns when signalled
440     */
441 jsr166 1.29 public void testAwait() throws InterruptedException {
442 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
443 dl 1.13 final Condition c = lock.newCondition();
444 jsr166 1.30 Thread t = new Thread(new CheckedRunnable() {
445 jsr166 1.29 public void realRun() throws InterruptedException {
446     lock.lock();
447     c.await();
448     lock.unlock();
449     }});
450 dl 1.5
451 jsr166 1.29 t.start();
452     Thread.sleep(SHORT_DELAY_MS);
453     lock.lock();
454     c.signal();
455     lock.unlock();
456     t.join(SHORT_DELAY_MS);
457     assertFalse(t.isAlive());
458 dl 1.5 }
459    
460 dl 1.6 /**
461 dl 1.14 * hasWaiters throws NPE if null
462     */
463     public void testHasWaitersNPE() {
464 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
465 dl 1.14 try {
466     lock.hasWaiters(null);
467     shouldThrow();
468 jsr166 1.29 } catch (NullPointerException success) {}
469 dl 1.14 }
470    
471     /**
472     * getWaitQueueLength throws NPE if null
473     */
474     public void testGetWaitQueueLengthNPE() {
475 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
476 dl 1.14 try {
477     lock.getWaitQueueLength(null);
478     shouldThrow();
479 jsr166 1.29 } catch (NullPointerException success) {}
480 dl 1.14 }
481    
482    
483     /**
484     * getWaitingThreads throws NPE if null
485     */
486     public void testGetWaitingThreadsNPE() {
487 jsr166 1.30 final PublicReentrantLock lock = new PublicReentrantLock();
488 dl 1.14 try {
489     lock.getWaitingThreads(null);
490     shouldThrow();
491 jsr166 1.29 } catch (NullPointerException success) {}
492 dl 1.14 }
493    
494    
495     /**
496 dl 1.13 * hasWaiters throws IAE if not owned
497     */
498     public void testHasWaitersIAE() {
499 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
500 jsr166 1.29 final Condition c = lock.newCondition();
501 jsr166 1.30 final ReentrantLock lock2 = new ReentrantLock();
502 dl 1.13 try {
503     lock2.hasWaiters(c);
504     shouldThrow();
505 jsr166 1.29 } catch (IllegalArgumentException success) {}
506 dl 1.13 }
507    
508     /**
509     * hasWaiters throws IMSE if not locked
510     */
511     public void testHasWaitersIMSE() {
512 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
513 jsr166 1.29 final Condition c = lock.newCondition();
514 dl 1.13 try {
515     lock.hasWaiters(c);
516     shouldThrow();
517 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
518 dl 1.13 }
519    
520    
521     /**
522     * getWaitQueueLength throws IAE if not owned
523     */
524     public void testGetWaitQueueLengthIAE() {
525 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
526 jsr166 1.29 final Condition c = lock.newCondition();
527 jsr166 1.30 final ReentrantLock lock2 = new ReentrantLock();
528 dl 1.13 try {
529     lock2.getWaitQueueLength(c);
530     shouldThrow();
531 jsr166 1.29 } catch (IllegalArgumentException success) {}
532 dl 1.13 }
533    
534     /**
535     * getWaitQueueLength throws IMSE if not locked
536     */
537     public void testGetWaitQueueLengthIMSE() {
538 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
539 jsr166 1.29 final Condition c = lock.newCondition();
540 dl 1.13 try {
541     lock.getWaitQueueLength(c);
542     shouldThrow();
543 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
544 dl 1.13 }
545    
546    
547     /**
548     * getWaitingThreads throws IAE if not owned
549     */
550     public void testGetWaitingThreadsIAE() {
551 jsr166 1.30 final PublicReentrantLock lock = new PublicReentrantLock();
552 jsr166 1.29 final Condition c = lock.newCondition();
553 jsr166 1.30 final PublicReentrantLock lock2 = new PublicReentrantLock();
554 dl 1.13 try {
555     lock2.getWaitingThreads(c);
556     shouldThrow();
557 jsr166 1.29 } catch (IllegalArgumentException success) {}
558 dl 1.13 }
559    
560     /**
561     * getWaitingThreads throws IMSE if not locked
562     */
563     public void testGetWaitingThreadsIMSE() {
564 jsr166 1.30 final PublicReentrantLock lock = new PublicReentrantLock();
565 jsr166 1.29 final Condition c = lock.newCondition();
566 dl 1.13 try {
567     lock.getWaitingThreads(c);
568     shouldThrow();
569 jsr166 1.29 } catch (IllegalMonitorStateException success) {}
570 dl 1.13 }
571    
572    
573     /**
574 dl 1.6 * hasWaiters returns true when a thread is waiting, else false
575     */
576 jsr166 1.29 public void testHasWaiters() throws InterruptedException {
577 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
578 dl 1.13 final Condition c = lock.newCondition();
579 jsr166 1.30 Thread t = new Thread(new CheckedRunnable() {
580 jsr166 1.29 public void realRun() throws InterruptedException {
581     lock.lock();
582     threadAssertFalse(lock.hasWaiters(c));
583     threadAssertEquals(0, lock.getWaitQueueLength(c));
584     c.await();
585     lock.unlock();
586     }});
587 dl 1.2
588 jsr166 1.29 t.start();
589     Thread.sleep(SHORT_DELAY_MS);
590     lock.lock();
591     assertTrue(lock.hasWaiters(c));
592     assertEquals(1, lock.getWaitQueueLength(c));
593     c.signal();
594     lock.unlock();
595     Thread.sleep(SHORT_DELAY_MS);
596     lock.lock();
597     assertFalse(lock.hasWaiters(c));
598     assertEquals(0, lock.getWaitQueueLength(c));
599     lock.unlock();
600     t.join(SHORT_DELAY_MS);
601     assertFalse(t.isAlive());
602 dl 1.5 }
603    
604 dl 1.6 /**
605     * getWaitQueueLength returns number of waiting threads
606     */
607 jsr166 1.29 public void testGetWaitQueueLength() throws InterruptedException {
608 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
609 dl 1.13 final Condition c = lock.newCondition();
610 jsr166 1.30 Thread t1 = new Thread(new CheckedRunnable() {
611 jsr166 1.29 public void realRun() throws InterruptedException {
612     lock.lock();
613     threadAssertFalse(lock.hasWaiters(c));
614     threadAssertEquals(0, lock.getWaitQueueLength(c));
615     c.await();
616     lock.unlock();
617     }});
618 dl 1.13
619 jsr166 1.30 Thread t2 = new Thread(new CheckedRunnable() {
620 jsr166 1.29 public void realRun() throws InterruptedException {
621     lock.lock();
622     threadAssertTrue(lock.hasWaiters(c));
623     threadAssertEquals(1, lock.getWaitQueueLength(c));
624     c.await();
625     lock.unlock();
626     }});
627    
628     t1.start();
629     Thread.sleep(SHORT_DELAY_MS);
630     t2.start();
631     Thread.sleep(SHORT_DELAY_MS);
632     lock.lock();
633     assertTrue(lock.hasWaiters(c));
634     assertEquals(2, lock.getWaitQueueLength(c));
635     c.signalAll();
636     lock.unlock();
637     Thread.sleep(SHORT_DELAY_MS);
638     lock.lock();
639     assertFalse(lock.hasWaiters(c));
640     assertEquals(0, lock.getWaitQueueLength(c));
641     lock.unlock();
642     t1.join(SHORT_DELAY_MS);
643     t2.join(SHORT_DELAY_MS);
644     assertFalse(t1.isAlive());
645     assertFalse(t2.isAlive());
646 dl 1.13 }
647    
648     /**
649     * getWaitingThreads returns only and all waiting threads
650     */
651 jsr166 1.29 public void testGetWaitingThreads() throws InterruptedException {
652 jsr166 1.30 final PublicReentrantLock lock = new PublicReentrantLock();
653 dl 1.13 final Condition c = lock.newCondition();
654 jsr166 1.30 Thread t1 = new Thread(new CheckedRunnable() {
655 jsr166 1.29 public void realRun() throws InterruptedException {
656     lock.lock();
657     threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
658     c.await();
659     lock.unlock();
660     }});
661    
662 jsr166 1.30 Thread t2 = new Thread(new CheckedRunnable() {
663 jsr166 1.29 public void realRun() throws InterruptedException {
664     lock.lock();
665     threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
666     c.await();
667     lock.unlock();
668     }});
669 dl 1.5
670 jsr166 1.29 lock.lock();
671     assertTrue(lock.getWaitingThreads(c).isEmpty());
672     lock.unlock();
673     t1.start();
674     Thread.sleep(SHORT_DELAY_MS);
675     t2.start();
676     Thread.sleep(SHORT_DELAY_MS);
677     lock.lock();
678     assertTrue(lock.hasWaiters(c));
679     assertTrue(lock.getWaitingThreads(c).contains(t1));
680     assertTrue(lock.getWaitingThreads(c).contains(t2));
681     c.signalAll();
682     lock.unlock();
683     Thread.sleep(SHORT_DELAY_MS);
684     lock.lock();
685     assertFalse(lock.hasWaiters(c));
686     assertTrue(lock.getWaitingThreads(c).isEmpty());
687     lock.unlock();
688     t1.join(SHORT_DELAY_MS);
689     t2.join(SHORT_DELAY_MS);
690     assertFalse(t1.isAlive());
691     assertFalse(t2.isAlive());
692 dl 1.2 }
693 dl 1.13
694 dl 1.22 /** A helper class for uninterruptible wait tests */
695 jsr166 1.29 class UninterruptibleThread extends Thread {
696 dl 1.22 private ReentrantLock lock;
697     private Condition c;
698 jsr166 1.26
699 dl 1.22 public volatile boolean canAwake = false;
700     public volatile boolean interrupted = false;
701     public volatile boolean lockStarted = false;
702 jsr166 1.26
703 jsr166 1.29 public UninterruptibleThread(ReentrantLock lock, Condition c) {
704 dl 1.22 this.lock = lock;
705     this.c = c;
706     }
707 jsr166 1.26
708 dl 1.22 public synchronized void run() {
709     lock.lock();
710     lockStarted = true;
711 jsr166 1.26
712 dl 1.22 while (!canAwake) {
713     c.awaitUninterruptibly();
714     }
715 jsr166 1.26
716 dl 1.22 interrupted = isInterrupted();
717     lock.unlock();
718     }
719     }
720 dl 1.2
721 dl 1.6 /**
722     * awaitUninterruptibly doesn't abort on interrupt
723     */
724 jsr166 1.29 public void testAwaitUninterruptibly() throws InterruptedException {
725 dl 1.22 final ReentrantLock lock = new ReentrantLock();
726 dl 1.2 final Condition c = lock.newCondition();
727 jsr166 1.29 UninterruptibleThread thread = new UninterruptibleThread(lock, c);
728 dl 1.2
729 jsr166 1.29 thread.start();
730 dl 1.22
731 jsr166 1.29 while (!thread.lockStarted) {
732     Thread.sleep(100);
733     }
734 dl 1.22
735 jsr166 1.29 lock.lock();
736     try {
737     thread.interrupt();
738     thread.canAwake = true;
739     c.signal();
740     } finally {
741     lock.unlock();
742     }
743 dl 1.22
744 jsr166 1.29 thread.join();
745     assertTrue(thread.interrupted);
746     assertFalse(thread.isAlive());
747 dl 1.2 }
748    
749 dl 1.6 /**
750     * await is interruptible
751     */
752 jsr166 1.29 public void testAwait_Interrupt() throws InterruptedException {
753 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
754 dl 1.2 final Condition c = lock.newCondition();
755 jsr166 1.30 Thread t = new Thread(new CheckedInterruptedRunnable() {
756     public void realRun() throws InterruptedException {
757 jsr166 1.29 lock.lock();
758     c.await();
759     }});
760    
761     t.start();
762     Thread.sleep(SHORT_DELAY_MS);
763     t.interrupt();
764     t.join(SHORT_DELAY_MS);
765     assertFalse(t.isAlive());
766 dl 1.2 }
767    
768 dl 1.6 /**
769     * awaitNanos is interruptible
770     */
771 jsr166 1.29 public void testAwaitNanos_Interrupt() throws InterruptedException {
772 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
773 dl 1.2 final Condition c = lock.newCondition();
774 jsr166 1.30 Thread t = new Thread(new CheckedInterruptedRunnable() {
775     public void realRun() throws InterruptedException {
776 jsr166 1.29 lock.lock();
777     c.awaitNanos(1000 * 1000 * 1000); // 1 sec
778     }});
779    
780     t.start();
781     Thread.sleep(SHORT_DELAY_MS);
782     t.interrupt();
783     t.join(SHORT_DELAY_MS);
784     assertFalse(t.isAlive());
785 dl 1.2 }
786    
787 dl 1.6 /**
788     * awaitUntil is interruptible
789     */
790 jsr166 1.29 public void testAwaitUntil_Interrupt() throws InterruptedException {
791 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
792 dl 1.2 final Condition c = lock.newCondition();
793 jsr166 1.30 Thread t = new Thread(new CheckedInterruptedRunnable() {
794     public void realRun() throws InterruptedException {
795 jsr166 1.29 lock.lock();
796     java.util.Date d = new java.util.Date();
797     c.awaitUntil(new java.util.Date(d.getTime() + 10000));
798     }});
799    
800     t.start();
801     Thread.sleep(SHORT_DELAY_MS);
802     t.interrupt();
803     t.join(SHORT_DELAY_MS);
804     assertFalse(t.isAlive());
805 dl 1.2 }
806    
807 dl 1.6 /**
808     * signalAll wakes up all threads
809     */
810 jsr166 1.29 public void testSignalAll() throws InterruptedException {
811 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
812 dl 1.2 final Condition c = lock.newCondition();
813 jsr166 1.30 Thread t1 = new Thread(new CheckedRunnable() {
814 jsr166 1.29 public void realRun() throws InterruptedException {
815     lock.lock();
816     c.await();
817     lock.unlock();
818     }});
819    
820 jsr166 1.30 Thread t2 = new Thread(new CheckedRunnable() {
821 jsr166 1.29 public void realRun() throws InterruptedException {
822     lock.lock();
823     c.await();
824     lock.unlock();
825     }});
826 dl 1.2
827 jsr166 1.29 t1.start();
828     t2.start();
829     Thread.sleep(SHORT_DELAY_MS);
830     lock.lock();
831     c.signalAll();
832     lock.unlock();
833     t1.join(SHORT_DELAY_MS);
834     t2.join(SHORT_DELAY_MS);
835     assertFalse(t1.isAlive());
836     assertFalse(t2.isAlive());
837 dl 1.3 }
838    
839 dl 1.6 /**
840 dl 1.23 * await after multiple reentrant locking preserves lock count
841     */
842 jsr166 1.29 public void testAwaitLockCount() throws InterruptedException {
843 jsr166 1.30 final ReentrantLock lock = new ReentrantLock();
844 dl 1.23 final Condition c = lock.newCondition();
845 jsr166 1.30 Thread t1 = new Thread(new CheckedRunnable() {
846 jsr166 1.29 public void realRun() throws InterruptedException {
847     lock.lock();
848     threadAssertEquals(1, lock.getHoldCount());
849     c.await();
850     threadAssertEquals(1, lock.getHoldCount());
851     lock.unlock();
852     }});
853 dl 1.23
854 jsr166 1.30 Thread t2 = new Thread(new CheckedRunnable() {
855 jsr166 1.29 public void realRun() throws InterruptedException {
856     lock.lock();
857     lock.lock();
858     threadAssertEquals(2, lock.getHoldCount());
859     c.await();
860     threadAssertEquals(2, lock.getHoldCount());
861     lock.unlock();
862     lock.unlock();
863     }});
864    
865     t1.start();
866     t2.start();
867     Thread.sleep(SHORT_DELAY_MS);
868     lock.lock();
869     c.signalAll();
870     lock.unlock();
871     t1.join(SHORT_DELAY_MS);
872     t2.join(SHORT_DELAY_MS);
873     assertFalse(t1.isAlive());
874     assertFalse(t2.isAlive());
875 dl 1.23 }
876    
877     /**
878 dl 1.6 * A serialized lock deserializes as unlocked
879     */
880 jsr166 1.29 public void testSerialization() throws Exception {
881 dl 1.3 ReentrantLock l = new ReentrantLock();
882     l.lock();
883     l.unlock();
884    
885 jsr166 1.29 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
886     ObjectOutputStream out =
887     new ObjectOutputStream(new BufferedOutputStream(bout));
888     out.writeObject(l);
889     out.close();
890    
891     ByteArrayInputStream bin =
892     new ByteArrayInputStream(bout.toByteArray());
893     ObjectInputStream in =
894     new ObjectInputStream(new BufferedInputStream(bin));
895     ReentrantLock r = (ReentrantLock) in.readObject();
896     r.lock();
897     r.unlock();
898 dl 1.2 }
899 dl 1.1
900 dl 1.18 /**
901     * toString indicates current lock state
902     */
903     public void testToString() {
904     ReentrantLock lock = new ReentrantLock();
905     String us = lock.toString();
906     assertTrue(us.indexOf("Unlocked") >= 0);
907     lock.lock();
908     String ls = lock.toString();
909     assertTrue(ls.indexOf("Locked") >= 0);
910     }
911    
912 dl 1.1 }