ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantLockTest.java
Revision: 1.13
Committed: Sun Dec 28 21:56:18 2003 UTC (20 years, 4 months ago) by dl
Branch: MAIN
Changes since 1.12: +212 -17 lines
Log Message:
Add tests for AQS extensions; adjust others for protected condition methods

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