ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AbstractQueuedSynchronizerTest.java
Revision: 1.33
Committed: Tue Dec 1 06:03:49 2009 UTC (14 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.32: +14 -10 lines
Log Message:
Use MILLISECONDS.toNanos instead of multiplying by 1000*1000; use explicit assertEquals instead of assertTrue(...!= null); improve testPutWithTake

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