ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AbstractQueuedSynchronizerTest.java
Revision: 1.37
Committed: Mon Oct 11 06:36:20 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.36: +1 -1 lines
Log Message:
typos

File Contents

# Content
1 /*
2 * 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 */
8
9
10 import junit.framework.*;
11 import java.util.*;
12 import java.util.concurrent.*;
13 import static java.util.concurrent.TimeUnit.MILLISECONDS;
14 import java.util.concurrent.locks.*;
15 import java.io.*;
16
17 public class AbstractQueuedSynchronizerTest extends JSR166TestCase {
18 public static void main(String[] args) {
19 junit.textui.TestRunner.run(suite());
20 }
21 public static Test suite() {
22 return new TestSuite(AbstractQueuedSynchronizerTest.class);
23 }
24
25 /**
26 * A simple mutex class, adapted from the
27 * AbstractQueuedSynchronizer javadoc. Exclusive acquire tests
28 * exercise this as a sample user extension. Other
29 * methods/features of AbstractQueuedSynchronizerTest are tested
30 * via other test classes, including those for ReentrantLock,
31 * ReentrantReadWriteLock, and Semaphore
32 */
33 static class Mutex extends AbstractQueuedSynchronizer {
34 public boolean isHeldExclusively() { return getState() == 1; }
35
36 public boolean tryAcquire(int acquires) {
37 assertEquals(1, acquires);
38 return compareAndSetState(0, 1);
39 }
40
41 public boolean tryRelease(int releases) {
42 if (getState() == 0) throw new IllegalMonitorStateException();
43 setState(0);
44 return true;
45 }
46
47 public AbstractQueuedSynchronizer.ConditionObject newCondition() {
48 return new AbstractQueuedSynchronizer.ConditionObject();
49 }
50
51 }
52
53
54 /**
55 * A simple latch class, to test shared mode.
56 */
57 static class BooleanLatch extends AbstractQueuedSynchronizer {
58 public boolean isSignalled() { return getState() != 0; }
59
60 public int tryAcquireShared(int ignore) {
61 return isSignalled()? 1 : -1;
62 }
63
64 public boolean tryReleaseShared(int ignore) {
65 setState(1);
66 return true;
67 }
68 }
69
70 /**
71 * A runnable calling acquireInterruptibly that does not expect to
72 * be interrupted.
73 */
74 class InterruptibleSyncRunnable extends CheckedRunnable {
75 final Mutex sync;
76 InterruptibleSyncRunnable(Mutex l) { sync = l; }
77 public void realRun() throws InterruptedException {
78 sync.acquireInterruptibly(1);
79 }
80 }
81
82
83 /**
84 * A runnable calling acquireInterruptibly that expects to be
85 * interrupted.
86 */
87 class InterruptedSyncRunnable extends CheckedInterruptedRunnable {
88 final Mutex sync;
89 InterruptedSyncRunnable(Mutex l) { sync = l; }
90 public void realRun() throws InterruptedException {
91 sync.acquireInterruptibly(1);
92 }
93 }
94
95 /**
96 * isHeldExclusively is false upon construction
97 */
98 public void testIsHeldExclusively() {
99 Mutex rl = new Mutex();
100 assertFalse(rl.isHeldExclusively());
101 }
102
103 /**
104 * acquiring released sync succeeds
105 */
106 public void testAcquire() {
107 Mutex rl = new Mutex();
108 rl.acquire(1);
109 assertTrue(rl.isHeldExclusively());
110 rl.release(1);
111 assertFalse(rl.isHeldExclusively());
112 }
113
114 /**
115 * tryAcquire on an released sync succeeds
116 */
117 public void testTryAcquire() {
118 Mutex rl = new Mutex();
119 assertTrue(rl.tryAcquire(1));
120 assertTrue(rl.isHeldExclusively());
121 rl.release(1);
122 }
123
124 /**
125 * hasQueuedThreads reports whether there are waiting threads
126 */
127 public void testhasQueuedThreads() throws InterruptedException {
128 final Mutex sync = new Mutex();
129 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
130 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
131 assertFalse(sync.hasQueuedThreads());
132 sync.acquire(1);
133 t1.start();
134 Thread.sleep(SHORT_DELAY_MS);
135 assertTrue(sync.hasQueuedThreads());
136 t2.start();
137 Thread.sleep(SHORT_DELAY_MS);
138 assertTrue(sync.hasQueuedThreads());
139 t1.interrupt();
140 Thread.sleep(SHORT_DELAY_MS);
141 assertTrue(sync.hasQueuedThreads());
142 sync.release(1);
143 Thread.sleep(SHORT_DELAY_MS);
144 assertFalse(sync.hasQueuedThreads());
145 t1.join();
146 t2.join();
147 }
148
149 /**
150 * isQueued(null) throws NPE
151 */
152 public void testIsQueuedNPE() {
153 final Mutex sync = new Mutex();
154 try {
155 sync.isQueued(null);
156 shouldThrow();
157 } catch (NullPointerException success) {}
158 }
159
160 /**
161 * isQueued reports whether a thread is queued.
162 */
163 public void testIsQueued() throws InterruptedException {
164 final Mutex sync = new Mutex();
165 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
166 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
167 assertFalse(sync.isQueued(t1));
168 assertFalse(sync.isQueued(t2));
169 sync.acquire(1);
170 t1.start();
171 Thread.sleep(SHORT_DELAY_MS);
172 assertTrue(sync.isQueued(t1));
173 t2.start();
174 Thread.sleep(SHORT_DELAY_MS);
175 assertTrue(sync.isQueued(t1));
176 assertTrue(sync.isQueued(t2));
177 t1.interrupt();
178 Thread.sleep(SHORT_DELAY_MS);
179 assertFalse(sync.isQueued(t1));
180 assertTrue(sync.isQueued(t2));
181 sync.release(1);
182 Thread.sleep(SHORT_DELAY_MS);
183 assertFalse(sync.isQueued(t1));
184 Thread.sleep(SHORT_DELAY_MS);
185 assertFalse(sync.isQueued(t2));
186 t1.join();
187 t2.join();
188 }
189
190 /**
191 * getFirstQueuedThread returns first waiting thread or null if none
192 */
193 public void testGetFirstQueuedThread() throws InterruptedException {
194 final Mutex sync = new Mutex();
195 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
196 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
197 assertNull(sync.getFirstQueuedThread());
198 sync.acquire(1);
199 t1.start();
200 Thread.sleep(SHORT_DELAY_MS);
201 assertEquals(t1, sync.getFirstQueuedThread());
202 t2.start();
203 Thread.sleep(SHORT_DELAY_MS);
204 assertEquals(t1, sync.getFirstQueuedThread());
205 t1.interrupt();
206 Thread.sleep(SHORT_DELAY_MS);
207 Thread.sleep(SHORT_DELAY_MS);
208 assertEquals(t2, sync.getFirstQueuedThread());
209 sync.release(1);
210 Thread.sleep(SHORT_DELAY_MS);
211 assertNull(sync.getFirstQueuedThread());
212 t1.join();
213 t2.join();
214 }
215
216
217 /**
218 * hasContended reports false if no thread has ever blocked, else true
219 */
220 public void testHasContended() throws InterruptedException {
221 final Mutex sync = new Mutex();
222 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
223 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
224 assertFalse(sync.hasContended());
225 sync.acquire(1);
226 t1.start();
227 Thread.sleep(SHORT_DELAY_MS);
228 assertTrue(sync.hasContended());
229 t2.start();
230 Thread.sleep(SHORT_DELAY_MS);
231 assertTrue(sync.hasContended());
232 t1.interrupt();
233 Thread.sleep(SHORT_DELAY_MS);
234 assertTrue(sync.hasContended());
235 sync.release(1);
236 Thread.sleep(SHORT_DELAY_MS);
237 assertTrue(sync.hasContended());
238 t1.join();
239 t2.join();
240 }
241
242 /**
243 * getQueuedThreads includes waiting threads
244 */
245 public void testGetQueuedThreads() throws InterruptedException {
246 final Mutex sync = new Mutex();
247 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
248 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
249 assertTrue(sync.getQueuedThreads().isEmpty());
250 sync.acquire(1);
251 assertTrue(sync.getQueuedThreads().isEmpty());
252 t1.start();
253 Thread.sleep(SHORT_DELAY_MS);
254 assertTrue(sync.getQueuedThreads().contains(t1));
255 t2.start();
256 Thread.sleep(SHORT_DELAY_MS);
257 assertTrue(sync.getQueuedThreads().contains(t1));
258 assertTrue(sync.getQueuedThreads().contains(t2));
259 t1.interrupt();
260 Thread.sleep(SHORT_DELAY_MS);
261 assertFalse(sync.getQueuedThreads().contains(t1));
262 assertTrue(sync.getQueuedThreads().contains(t2));
263 sync.release(1);
264 Thread.sleep(SHORT_DELAY_MS);
265 assertTrue(sync.getQueuedThreads().isEmpty());
266 t1.join();
267 t2.join();
268 }
269
270 /**
271 * getExclusiveQueuedThreads includes waiting threads
272 */
273 public void testGetExclusiveQueuedThreads() throws InterruptedException {
274 final Mutex sync = new Mutex();
275 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
276 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
277 assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
278 sync.acquire(1);
279 assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
280 t1.start();
281 Thread.sleep(SHORT_DELAY_MS);
282 assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
283 t2.start();
284 Thread.sleep(SHORT_DELAY_MS);
285 assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
286 assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
287 t1.interrupt();
288 Thread.sleep(SHORT_DELAY_MS);
289 assertFalse(sync.getExclusiveQueuedThreads().contains(t1));
290 assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
291 sync.release(1);
292 Thread.sleep(SHORT_DELAY_MS);
293 assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
294 t1.join();
295 t2.join();
296 }
297
298 /**
299 * getSharedQueuedThreads does not include exclusively waiting threads
300 */
301 public void testGetSharedQueuedThreads() throws InterruptedException {
302 final Mutex sync = new Mutex();
303 Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
304 Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
305 assertTrue(sync.getSharedQueuedThreads().isEmpty());
306 sync.acquire(1);
307 assertTrue(sync.getSharedQueuedThreads().isEmpty());
308 t1.start();
309 Thread.sleep(SHORT_DELAY_MS);
310 assertTrue(sync.getSharedQueuedThreads().isEmpty());
311 t2.start();
312 Thread.sleep(SHORT_DELAY_MS);
313 assertTrue(sync.getSharedQueuedThreads().isEmpty());
314 t1.interrupt();
315 Thread.sleep(SHORT_DELAY_MS);
316 assertTrue(sync.getSharedQueuedThreads().isEmpty());
317 sync.release(1);
318 Thread.sleep(SHORT_DELAY_MS);
319 assertTrue(sync.getSharedQueuedThreads().isEmpty());
320 t1.join();
321 t2.join();
322 }
323
324 /**
325 * tryAcquireNanos is interruptible.
326 */
327 public void testInterruptedException2() throws InterruptedException {
328 final Mutex sync = new Mutex();
329 sync.acquire(1);
330 Thread t = new Thread(new CheckedInterruptedRunnable() {
331 public void realRun() throws InterruptedException {
332 sync.tryAcquireNanos(1, MILLISECONDS.toNanos(MEDIUM_DELAY_MS));
333 }});
334
335 t.start();
336 Thread.sleep(SHORT_DELAY_MS);
337 t.interrupt();
338 t.join();
339 }
340
341
342 /**
343 * TryAcquire on exclusively held sync fails
344 */
345 public void testTryAcquireWhenSynced() throws InterruptedException {
346 final Mutex sync = new Mutex();
347 sync.acquire(1);
348 Thread t = new Thread(new CheckedRunnable() {
349 public void realRun() {
350 assertFalse(sync.tryAcquire(1));
351 }});
352
353 t.start();
354 t.join();
355 sync.release(1);
356 }
357
358 /**
359 * tryAcquireNanos on an exclusively held sync times out
360 */
361 public void testAcquireNanos_Timeout() throws InterruptedException {
362 final Mutex sync = new Mutex();
363 sync.acquire(1);
364 Thread t = new Thread(new CheckedRunnable() {
365 public void realRun() throws InterruptedException {
366 long nanos = MILLISECONDS.toNanos(SHORT_DELAY_MS);
367 assertFalse(sync.tryAcquireNanos(1, nanos));
368 }});
369
370 t.start();
371 t.join();
372 sync.release(1);
373 }
374
375
376 /**
377 * getState is true when acquired and false when not
378 */
379 public void testGetState() throws InterruptedException {
380 final Mutex sync = new Mutex();
381 sync.acquire(1);
382 assertTrue(sync.isHeldExclusively());
383 sync.release(1);
384 assertFalse(sync.isHeldExclusively());
385 Thread t = new Thread(new CheckedRunnable() {
386 public void realRun() throws InterruptedException {
387 sync.acquire(1);
388 Thread.sleep(SMALL_DELAY_MS);
389 sync.release(1);
390 }});
391
392 t.start();
393 Thread.sleep(SHORT_DELAY_MS);
394 assertTrue(sync.isHeldExclusively());
395 t.join();
396 assertFalse(sync.isHeldExclusively());
397 }
398
399
400 /**
401 * acquireInterruptibly is interruptible.
402 */
403 public void testAcquireInterruptibly1() throws InterruptedException {
404 final Mutex sync = new Mutex();
405 sync.acquire(1);
406 Thread t = new Thread(new InterruptedSyncRunnable(sync));
407
408 t.start();
409 Thread.sleep(SHORT_DELAY_MS);
410 t.interrupt();
411 Thread.sleep(SHORT_DELAY_MS);
412 sync.release(1);
413 t.join();
414 }
415
416 /**
417 * acquireInterruptibly succeeds when released, else is interruptible
418 */
419 public void testAcquireInterruptibly2() throws InterruptedException {
420 final Mutex sync = new Mutex();
421 sync.acquireInterruptibly(1);
422 Thread t = new Thread(new InterruptedSyncRunnable(sync));
423 t.start();
424 Thread.sleep(SHORT_DELAY_MS);
425 t.interrupt();
426 assertTrue(sync.isHeldExclusively());
427 t.join();
428 }
429
430 /**
431 * owns is true for a condition created by sync else false
432 */
433 public void testOwns() {
434 final Mutex sync = new Mutex();
435 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
436 final Mutex sync2 = new Mutex();
437 assertTrue(sync.owns(c));
438 assertFalse(sync2.owns(c));
439 }
440
441 /**
442 * Calling await without holding sync throws IllegalMonitorStateException
443 */
444 public void testAwait_IllegalMonitor() throws InterruptedException {
445 final Mutex sync = new Mutex();
446 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
447 try {
448 c.await();
449 shouldThrow();
450 } catch (IllegalMonitorStateException success) {}
451 }
452
453 /**
454 * Calling signal without holding sync throws IllegalMonitorStateException
455 */
456 public void testSignal_IllegalMonitor() {
457 final Mutex sync = new Mutex();
458 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
459 try {
460 c.signal();
461 shouldThrow();
462 } catch (IllegalMonitorStateException success) {}
463 }
464
465 /**
466 * awaitNanos without a signal times out
467 */
468 public void testAwaitNanos_Timeout() throws InterruptedException {
469 final Mutex sync = new Mutex();
470 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
471 sync.acquire(1);
472 long t = c.awaitNanos(100);
473 assertTrue(t <= 0);
474 sync.release(1);
475 }
476
477 /**
478 * Timed await without a signal times out
479 */
480 public void testAwait_Timeout() throws InterruptedException {
481 final Mutex sync = new Mutex();
482 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
483 sync.acquire(1);
484 assertFalse(c.await(SHORT_DELAY_MS, MILLISECONDS));
485 sync.release(1);
486 }
487
488 /**
489 * awaitUntil without a signal times out
490 */
491 public void testAwaitUntil_Timeout() throws InterruptedException {
492 final Mutex sync = new Mutex();
493 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
494 sync.acquire(1);
495 java.util.Date d = new java.util.Date();
496 assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
497 sync.release(1);
498 }
499
500 /**
501 * await returns when signalled
502 */
503 public void testAwait() throws InterruptedException {
504 final Mutex sync = new Mutex();
505 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
506 Thread t = new Thread(new CheckedRunnable() {
507 public void realRun() throws InterruptedException {
508 sync.acquire(1);
509 c.await();
510 sync.release(1);
511 }});
512
513 t.start();
514 Thread.sleep(SHORT_DELAY_MS);
515 sync.acquire(1);
516 c.signal();
517 sync.release(1);
518 t.join(SHORT_DELAY_MS);
519 assertFalse(t.isAlive());
520 }
521
522
523
524 /**
525 * hasWaiters throws NPE if null
526 */
527 public void testHasWaitersNPE() {
528 final Mutex sync = new Mutex();
529 try {
530 sync.hasWaiters(null);
531 shouldThrow();
532 } catch (NullPointerException success) {}
533 }
534
535 /**
536 * getWaitQueueLength throws NPE if null
537 */
538 public void testGetWaitQueueLengthNPE() {
539 final Mutex sync = new Mutex();
540 try {
541 sync.getWaitQueueLength(null);
542 shouldThrow();
543 } catch (NullPointerException success) {}
544 }
545
546
547 /**
548 * getWaitingThreads throws NPE if null
549 */
550 public void testGetWaitingThreadsNPE() {
551 final Mutex sync = new Mutex();
552 try {
553 sync.getWaitingThreads(null);
554 shouldThrow();
555 } catch (NullPointerException success) {}
556 }
557
558
559 /**
560 * hasWaiters throws IAE if not owned
561 */
562 public void testHasWaitersIAE() {
563 final Mutex sync = new Mutex();
564 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
565 final Mutex sync2 = new Mutex();
566 try {
567 sync2.hasWaiters(c);
568 shouldThrow();
569 } catch (IllegalArgumentException success) {}
570 }
571
572 /**
573 * hasWaiters throws IMSE if not synced
574 */
575 public void testHasWaitersIMSE() {
576 final Mutex sync = new Mutex();
577 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
578 try {
579 sync.hasWaiters(c);
580 shouldThrow();
581 } catch (IllegalMonitorStateException success) {}
582 }
583
584
585 /**
586 * getWaitQueueLength throws IAE if not owned
587 */
588 public void testGetWaitQueueLengthIAE() {
589 final Mutex sync = new Mutex();
590 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
591 final Mutex sync2 = new Mutex();
592 try {
593 sync2.getWaitQueueLength(c);
594 shouldThrow();
595 } catch (IllegalArgumentException success) {}
596 }
597
598 /**
599 * getWaitQueueLength throws IMSE if not synced
600 */
601 public void testGetWaitQueueLengthIMSE() {
602 final Mutex sync = new Mutex();
603 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
604 try {
605 sync.getWaitQueueLength(c);
606 shouldThrow();
607 } catch (IllegalMonitorStateException success) {}
608 }
609
610
611 /**
612 * getWaitingThreads throws IAE if not owned
613 */
614 public void testGetWaitingThreadsIAE() {
615 final Mutex sync = new Mutex();
616 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
617 final Mutex sync2 = new Mutex();
618 try {
619 sync2.getWaitingThreads(c);
620 shouldThrow();
621 } catch (IllegalArgumentException success) {}
622 }
623
624 /**
625 * getWaitingThreads throws IMSE if not synced
626 */
627 public void testGetWaitingThreadsIMSE() {
628 final Mutex sync = new Mutex();
629 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
630 try {
631 sync.getWaitingThreads(c);
632 shouldThrow();
633 } catch (IllegalMonitorStateException success) {}
634 }
635
636
637
638 /**
639 * hasWaiters returns true when a thread is waiting, else false
640 */
641 public void testHasWaiters() throws InterruptedException {
642 final Mutex sync = new Mutex();
643 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
644 Thread t = new Thread(new CheckedRunnable() {
645 public void realRun() throws InterruptedException {
646 sync.acquire(1);
647 assertFalse(sync.hasWaiters(c));
648 assertEquals(0, sync.getWaitQueueLength(c));
649 c.await();
650 sync.release(1);
651 }});
652
653 t.start();
654 Thread.sleep(SHORT_DELAY_MS);
655 sync.acquire(1);
656 assertTrue(sync.hasWaiters(c));
657 assertEquals(1, sync.getWaitQueueLength(c));
658 c.signal();
659 sync.release(1);
660 Thread.sleep(SHORT_DELAY_MS);
661 sync.acquire(1);
662 assertFalse(sync.hasWaiters(c));
663 assertEquals(0, sync.getWaitQueueLength(c));
664 sync.release(1);
665 t.join(SHORT_DELAY_MS);
666 assertFalse(t.isAlive());
667 }
668
669 /**
670 * getWaitQueueLength returns number of waiting threads
671 */
672 public void testGetWaitQueueLength() throws InterruptedException {
673 final Mutex sync = new Mutex();
674 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
675 Thread t1 = new Thread(new CheckedRunnable() {
676 public void realRun() throws InterruptedException {
677 sync.acquire(1);
678 assertFalse(sync.hasWaiters(c));
679 assertEquals(0, sync.getWaitQueueLength(c));
680 c.await();
681 sync.release(1);
682 }});
683
684 Thread t2 = new Thread(new CheckedRunnable() {
685 public void realRun() throws InterruptedException {
686 sync.acquire(1);
687 assertTrue(sync.hasWaiters(c));
688 assertEquals(1, sync.getWaitQueueLength(c));
689 c.await();
690 sync.release(1);
691 }});
692
693 t1.start();
694 Thread.sleep(SHORT_DELAY_MS);
695 t2.start();
696 Thread.sleep(SHORT_DELAY_MS);
697 sync.acquire(1);
698 assertTrue(sync.hasWaiters(c));
699 assertEquals(2, sync.getWaitQueueLength(c));
700 c.signalAll();
701 sync.release(1);
702 Thread.sleep(SHORT_DELAY_MS);
703 sync.acquire(1);
704 assertFalse(sync.hasWaiters(c));
705 assertEquals(0, sync.getWaitQueueLength(c));
706 sync.release(1);
707 t1.join(SHORT_DELAY_MS);
708 t2.join(SHORT_DELAY_MS);
709 assertFalse(t1.isAlive());
710 assertFalse(t2.isAlive());
711 }
712
713 /**
714 * getWaitingThreads returns only and all waiting threads
715 */
716 public void testGetWaitingThreads() throws InterruptedException {
717 final Mutex sync = new Mutex();
718 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
719 Thread t1 = new Thread(new CheckedRunnable() {
720 public void realRun() throws InterruptedException {
721 sync.acquire(1);
722 assertTrue(sync.getWaitingThreads(c).isEmpty());
723 c.await();
724 sync.release(1);
725 }});
726
727 Thread t2 = new Thread(new CheckedRunnable() {
728 public void realRun() throws InterruptedException {
729 sync.acquire(1);
730 assertFalse(sync.getWaitingThreads(c).isEmpty());
731 c.await();
732 sync.release(1);
733 }});
734
735 sync.acquire(1);
736 assertTrue(sync.getWaitingThreads(c).isEmpty());
737 sync.release(1);
738 t1.start();
739 Thread.sleep(SHORT_DELAY_MS);
740 t2.start();
741 Thread.sleep(SHORT_DELAY_MS);
742 sync.acquire(1);
743 assertTrue(sync.hasWaiters(c));
744 assertTrue(sync.getWaitingThreads(c).contains(t1));
745 assertTrue(sync.getWaitingThreads(c).contains(t2));
746 c.signalAll();
747 sync.release(1);
748 Thread.sleep(SHORT_DELAY_MS);
749 sync.acquire(1);
750 assertFalse(sync.hasWaiters(c));
751 assertTrue(sync.getWaitingThreads(c).isEmpty());
752 sync.release(1);
753 t1.join(SHORT_DELAY_MS);
754 t2.join(SHORT_DELAY_MS);
755 assertFalse(t1.isAlive());
756 assertFalse(t2.isAlive());
757 }
758
759
760
761 /**
762 * awaitUninterruptibly doesn't abort on interrupt
763 */
764 public void testAwaitUninterruptibly() throws InterruptedException {
765 final Mutex sync = new Mutex();
766 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
767 Thread t = new Thread(new CheckedRunnable() {
768 public void realRun() {
769 sync.acquire(1);
770 c.awaitUninterruptibly();
771 sync.release(1);
772 }});
773
774 t.start();
775 Thread.sleep(SHORT_DELAY_MS);
776 t.interrupt();
777 sync.acquire(1);
778 c.signal();
779 sync.release(1);
780 t.join(SHORT_DELAY_MS);
781 assertFalse(t.isAlive());
782 }
783
784 /**
785 * await is interruptible
786 */
787 public void testAwait_Interrupt() throws InterruptedException {
788 final Mutex sync = new Mutex();
789 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
790 Thread t = new Thread(new CheckedInterruptedRunnable() {
791 public void realRun() throws InterruptedException {
792 sync.acquire(1);
793 c.await();
794 }});
795
796 t.start();
797 Thread.sleep(SHORT_DELAY_MS);
798 t.interrupt();
799 t.join(SHORT_DELAY_MS);
800 assertFalse(t.isAlive());
801 }
802
803 /**
804 * awaitNanos is interruptible
805 */
806 public void testAwaitNanos_Interrupt() throws InterruptedException {
807 final Mutex sync = new Mutex();
808 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
809 Thread t = new Thread(new CheckedInterruptedRunnable() {
810 public void realRun() throws InterruptedException {
811 sync.acquire(1);
812 c.awaitNanos(MILLISECONDS.toNanos(LONG_DELAY_MS));
813 }});
814
815 t.start();
816 Thread.sleep(SHORT_DELAY_MS);
817 t.interrupt();
818 t.join(SHORT_DELAY_MS);
819 assertFalse(t.isAlive());
820 }
821
822 /**
823 * awaitUntil is interruptible
824 */
825 public void testAwaitUntil_Interrupt() throws InterruptedException {
826 final Mutex sync = new Mutex();
827 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
828 Thread t = new Thread(new CheckedInterruptedRunnable() {
829 public void realRun() throws InterruptedException {
830 sync.acquire(1);
831 java.util.Date d = new java.util.Date();
832 c.awaitUntil(new java.util.Date(d.getTime() + 10000));
833 }});
834
835 t.start();
836 Thread.sleep(SHORT_DELAY_MS);
837 t.interrupt();
838 t.join(SHORT_DELAY_MS);
839 assertFalse(t.isAlive());
840 }
841
842 /**
843 * signalAll wakes up all threads
844 */
845 public void testSignalAll() throws InterruptedException {
846 final Mutex sync = new Mutex();
847 final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
848 Thread t1 = new Thread(new CheckedRunnable() {
849 public void realRun() throws InterruptedException {
850 sync.acquire(1);
851 c.await();
852 sync.release(1);
853 }});
854
855 Thread t2 = new Thread(new CheckedRunnable() {
856 public void realRun() throws InterruptedException {
857 sync.acquire(1);
858 c.await();
859 sync.release(1);
860 }});
861
862 t1.start();
863 t2.start();
864 Thread.sleep(SHORT_DELAY_MS);
865 sync.acquire(1);
866 c.signalAll();
867 sync.release(1);
868 t1.join(SHORT_DELAY_MS);
869 t2.join(SHORT_DELAY_MS);
870 assertFalse(t1.isAlive());
871 assertFalse(t2.isAlive());
872 }
873
874
875 /**
876 * toString indicates current state
877 */
878 public void testToString() {
879 Mutex sync = new Mutex();
880 String us = sync.toString();
881 assertTrue(us.indexOf("State = 0") >= 0);
882 sync.acquire(1);
883 String ls = sync.toString();
884 assertTrue(ls.indexOf("State = 1") >= 0);
885 }
886
887 /**
888 * A serialized AQS deserializes with current state
889 */
890 public void testSerialization() throws Exception {
891 Mutex l = new Mutex();
892 l.acquire(1);
893 assertTrue(l.isHeldExclusively());
894
895 ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
896 ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
897 out.writeObject(l);
898 out.close();
899
900 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
901 ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
902 Mutex r = (Mutex) in.readObject();
903 assertTrue(r.isHeldExclusively());
904 }
905
906
907 /**
908 * tryReleaseShared setting state changes getState
909 */
910 public void testGetStateWithReleaseShared() {
911 final BooleanLatch l = new BooleanLatch();
912 assertFalse(l.isSignalled());
913 l.releaseShared(0);
914 assertTrue(l.isSignalled());
915 }
916
917 /**
918 * releaseShared has no effect when already signalled
919 */
920 public void testReleaseShared() {
921 final BooleanLatch l = new BooleanLatch();
922 assertFalse(l.isSignalled());
923 l.releaseShared(0);
924 assertTrue(l.isSignalled());
925 l.releaseShared(0);
926 assertTrue(l.isSignalled());
927 }
928
929 /**
930 * acquireSharedInterruptibly returns after release, but not before
931 */
932 public void testAcquireSharedInterruptibly() throws InterruptedException {
933 final BooleanLatch l = new BooleanLatch();
934
935 Thread t = new Thread(new CheckedRunnable() {
936 public void realRun() throws InterruptedException {
937 assertFalse(l.isSignalled());
938 l.acquireSharedInterruptibly(0);
939 assertTrue(l.isSignalled());
940 }});
941
942 t.start();
943 assertFalse(l.isSignalled());
944 Thread.sleep(SHORT_DELAY_MS);
945 l.releaseShared(0);
946 assertTrue(l.isSignalled());
947 t.join();
948 }
949
950
951 /**
952 * acquireSharedTimed returns after release
953 */
954 public void testAcquireSharedTimed() throws InterruptedException {
955 final BooleanLatch l = new BooleanLatch();
956
957 Thread t = new Thread(new CheckedRunnable() {
958 public void realRun() throws InterruptedException {
959 assertFalse(l.isSignalled());
960 long nanos = MILLISECONDS.toNanos(MEDIUM_DELAY_MS);
961 assertTrue(l.tryAcquireSharedNanos(0, nanos));
962 assertTrue(l.isSignalled());
963 }});
964
965 t.start();
966 assertFalse(l.isSignalled());
967 Thread.sleep(SHORT_DELAY_MS);
968 l.releaseShared(0);
969 assertTrue(l.isSignalled());
970 t.join();
971 }
972
973 /**
974 * acquireSharedInterruptibly throws IE if interrupted before released
975 */
976 public void testAcquireSharedInterruptibly_InterruptedException() throws InterruptedException {
977 final BooleanLatch l = new BooleanLatch();
978 Thread t = new Thread(new CheckedInterruptedRunnable() {
979 public void realRun() throws InterruptedException {
980 assertFalse(l.isSignalled());
981 l.acquireSharedInterruptibly(0);
982 }});
983
984 t.start();
985 assertFalse(l.isSignalled());
986 t.interrupt();
987 t.join();
988 }
989
990 /**
991 * acquireSharedTimed throws IE if interrupted before released
992 */
993 public void testAcquireSharedNanos_InterruptedException() throws InterruptedException {
994 final BooleanLatch l = new BooleanLatch();
995 Thread t = new Thread(new CheckedInterruptedRunnable() {
996 public void realRun() throws InterruptedException {
997 assertFalse(l.isSignalled());
998 long nanos = MILLISECONDS.toNanos(SMALL_DELAY_MS);
999 l.tryAcquireSharedNanos(0, nanos);
1000 }});
1001
1002 t.start();
1003 Thread.sleep(SHORT_DELAY_MS);
1004 assertFalse(l.isSignalled());
1005 t.interrupt();
1006 t.join();
1007 }
1008
1009 /**
1010 * acquireSharedTimed times out if not released before timeout
1011 */
1012 public void testAcquireSharedNanos_Timeout() throws InterruptedException {
1013 final BooleanLatch l = new BooleanLatch();
1014 Thread t = new Thread(new CheckedRunnable() {
1015 public void realRun() throws InterruptedException {
1016 assertFalse(l.isSignalled());
1017 long nanos = MILLISECONDS.toNanos(SMALL_DELAY_MS);
1018 assertFalse(l.tryAcquireSharedNanos(0, nanos));
1019 }});
1020
1021 t.start();
1022 Thread.sleep(SHORT_DELAY_MS);
1023 assertFalse(l.isSignalled());
1024 t.join();
1025 }
1026
1027 }