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