ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/StampedLockTest.java
Revision: 1.6
Committed: Thu Mar 21 19:06:54 2013 UTC (11 years, 1 month ago) by dl
Branch: MAIN
Changes since 1.5: +14 -7 lines
Log Message:
test new map methods

File Contents

# Content
1 /*
2 * Written by Doug Lea and Martin Buchholz
3 * with assistance from members of JCP JSR-166 Expert Group and
4 * released to the public domain, as explained at
5 * http://creativecommons.org/publicdomain/zero/1.0/
6 */
7
8 import junit.framework.*;
9 import java.util.concurrent.atomic.AtomicBoolean;
10 import java.util.concurrent.locks.Lock;
11 import java.util.concurrent.locks.StampedLock;
12 import java.util.concurrent.CountDownLatch;
13 import static java.util.concurrent.TimeUnit.MILLISECONDS;
14 import java.util.*;
15 import java.util.concurrent.*;
16
17 public class StampedLockTest 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(StampedLockTest.class);
23 }
24
25 /**
26 * A runnable calling writeLockInterruptibly
27 */
28 class InterruptibleLockRunnable extends CheckedRunnable {
29 final StampedLock lock;
30 InterruptibleLockRunnable(StampedLock l) { lock = l; }
31 public void realRun() throws InterruptedException {
32 lock.writeLockInterruptibly();
33 }
34 }
35
36 /**
37 * A runnable calling writeLockInterruptibly that expects to be
38 * interrupted
39 */
40 class InterruptedLockRunnable extends CheckedInterruptedRunnable {
41 final StampedLock lock;
42 InterruptedLockRunnable(StampedLock l) { lock = l; }
43 public void realRun() throws InterruptedException {
44 lock.writeLockInterruptibly();
45 }
46 }
47
48 /**
49 * Releases write lock, checking isWriteLocked before and after
50 */
51 void releaseWriteLock(StampedLock lock, long s) {
52 assertTrue(lock.isWriteLocked());
53 lock.unlockWrite(s);
54 assertFalse(lock.isWriteLocked());
55 }
56
57 /**
58 * Constructed StampedLock is in unlocked state
59 */
60 public void testConstructor() {
61 StampedLock lock;
62 lock = new StampedLock();
63 assertFalse(lock.isWriteLocked());
64 assertFalse(lock.isReadLocked());
65 assertEquals(lock.getReadLockCount(), 0);
66 }
67
68 /**
69 * write-locking and read-locking an unlocked lock succeed
70 */
71 public void testLock() {
72 StampedLock lock = new StampedLock();
73 assertFalse(lock.isWriteLocked());
74 assertFalse(lock.isReadLocked());
75 assertEquals(lock.getReadLockCount(), 0);
76 long s = lock.writeLock();
77 assertTrue(lock.isWriteLocked());
78 assertFalse(lock.isReadLocked());
79 assertEquals(lock.getReadLockCount(), 0);
80 lock.unlockWrite(s);
81 assertFalse(lock.isWriteLocked());
82 assertFalse(lock.isReadLocked());
83 assertEquals(lock.getReadLockCount(), 0);
84 long rs = lock.readLock();
85 assertFalse(lock.isWriteLocked());
86 assertTrue(lock.isReadLocked());
87 assertEquals(lock.getReadLockCount(), 1);
88 lock.unlockRead(rs);
89 assertFalse(lock.isWriteLocked());
90 assertFalse(lock.isReadLocked());
91 assertEquals(lock.getReadLockCount(), 0);
92 }
93
94 /**
95 * unlock releases either a read or write lock
96 */
97 public void testUnlock() {
98 StampedLock lock = new StampedLock();
99 assertFalse(lock.isWriteLocked());
100 assertFalse(lock.isReadLocked());
101 assertEquals(lock.getReadLockCount(), 0);
102 long s = lock.writeLock();
103 assertTrue(lock.isWriteLocked());
104 assertFalse(lock.isReadLocked());
105 assertEquals(lock.getReadLockCount(), 0);
106 lock.unlock(s);
107 assertFalse(lock.isWriteLocked());
108 assertFalse(lock.isReadLocked());
109 assertEquals(lock.getReadLockCount(), 0);
110 long rs = lock.readLock();
111 assertFalse(lock.isWriteLocked());
112 assertTrue(lock.isReadLocked());
113 assertEquals(lock.getReadLockCount(), 1);
114 lock.unlock(rs);
115 assertFalse(lock.isWriteLocked());
116 assertFalse(lock.isReadLocked());
117 assertEquals(lock.getReadLockCount(), 0);
118 }
119
120 /**
121 * tryUnlockRead/Write succeeds if locked in associated mode else
122 * returns false
123 */
124 public void testTryUnlock() {
125 StampedLock lock = new StampedLock();
126 assertFalse(lock.isWriteLocked());
127 assertFalse(lock.isReadLocked());
128 assertEquals(lock.getReadLockCount(), 0);
129 long s = lock.writeLock();
130 assertTrue(lock.isWriteLocked());
131 assertFalse(lock.isReadLocked());
132 assertEquals(lock.getReadLockCount(), 0);
133 assertFalse(lock.tryUnlockRead());
134 assertTrue(lock.tryUnlockWrite());
135 assertFalse(lock.tryUnlockWrite());
136 assertFalse(lock.tryUnlockRead());
137 assertFalse(lock.isWriteLocked());
138 assertFalse(lock.isReadLocked());
139 assertEquals(lock.getReadLockCount(), 0);
140 long rs = lock.readLock();
141 assertFalse(lock.isWriteLocked());
142 assertTrue(lock.isReadLocked());
143 assertEquals(lock.getReadLockCount(), 1);
144 assertFalse(lock.tryUnlockWrite());
145 assertTrue(lock.tryUnlockRead());
146 assertFalse(lock.tryUnlockRead());
147 assertFalse(lock.tryUnlockWrite());
148 assertFalse(lock.isWriteLocked());
149 assertFalse(lock.isReadLocked());
150 assertEquals(lock.getReadLockCount(), 0);
151 }
152
153 /**
154 * write-unlocking an unlocked lock throws IllegalMonitorStateException
155 */
156 public void testWriteUnlock_IMSE() {
157 StampedLock lock = new StampedLock();
158 try {
159 lock.unlockWrite(0L);
160 shouldThrow();
161 } catch (IllegalMonitorStateException success) {}
162 }
163
164 /**
165 * write-unlocking an unlocked lock throws IllegalMonitorStateException
166 */
167 public void testWriteUnlock_IMSE2() {
168 StampedLock lock = new StampedLock();
169 try {
170 long s = lock.writeLock();
171 lock.unlockWrite(s);
172 lock.unlockWrite(s);
173 shouldThrow();
174 } catch (IllegalMonitorStateException success) {}
175 }
176
177 /**
178 * write-unlocking after readlock throws IllegalMonitorStateException
179 */
180 public void testWriteUnlock_IMSE3() {
181 StampedLock lock = new StampedLock();
182 try {
183 long s = lock.readLock();
184 lock.unlockWrite(s);
185 shouldThrow();
186 } catch (IllegalMonitorStateException success) {}
187 }
188
189 /**
190 * read-unlocking an unlocked lock throws IllegalMonitorStateException
191 */
192 public void testReadUnlock_IMSE() {
193 StampedLock lock = new StampedLock();
194 try {
195 long s = lock.readLock();
196 lock.unlockRead(s);
197 lock.unlockRead(s);
198 shouldThrow();
199 } catch (IllegalMonitorStateException success) {}
200 }
201
202 /**
203 * read-unlocking an unlocked lock throws IllegalMonitorStateException
204 */
205 public void testReadUnlock_IMSE2() {
206 StampedLock lock = new StampedLock();
207 try {
208 lock.unlockRead(0L);
209 shouldThrow();
210 } catch (IllegalMonitorStateException success) {}
211 }
212
213 /**
214 * read-unlocking after writeLock throws IllegalMonitorStateException
215 */
216 public void testReadUnlock_IMSE3() {
217 StampedLock lock = new StampedLock();
218 try {
219 long s = lock.writeLock();
220 lock.unlockRead(s);
221 shouldThrow();
222 } catch (IllegalMonitorStateException success) {}
223 }
224
225 /**
226 * validate(0) fails
227 */
228 public void testValidate0() {
229 StampedLock lock = new StampedLock();
230 assertFalse(lock.validate(0L));
231 }
232
233 /**
234 * A stamp obtained from a successful lock operation validates
235 */
236 public void testValidate() {
237 try {
238 StampedLock lock = new StampedLock();
239 long s = lock.writeLock();
240 assertTrue(lock.validate(s));
241 lock.unlockWrite(s);
242 s = lock.readLock();
243 assertTrue(lock.validate(s));
244 lock.unlockRead(s);
245 assertTrue((s = lock.tryWriteLock()) != 0L);
246 assertTrue(lock.validate(s));
247 lock.unlockWrite(s);
248 assertTrue((s = lock.tryReadLock()) != 0L);
249 assertTrue(lock.validate(s));
250 lock.unlockRead(s);
251 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
252 assertTrue(lock.validate(s));
253 lock.unlockWrite(s);
254 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
255 assertTrue(lock.validate(s));
256 lock.unlockRead(s);
257 assertTrue((s = lock.tryOptimisticRead()) != 0L);
258 } catch (InterruptedException ie) {
259 threadUnexpectedException(ie);
260 }
261 }
262
263 /**
264 * A stamp obtained from an unsuccessful lock operation does not validate
265 */
266 public void testValidate2() {
267 try {
268 StampedLock lock = new StampedLock();
269 long s;
270 assertTrue((s = lock.writeLock()) != 0L);
271 assertTrue(lock.validate(s));
272 assertFalse(lock.validate(lock.tryWriteLock()));
273 assertFalse(lock.validate(lock.tryWriteLock(100L, MILLISECONDS)));
274 assertFalse(lock.validate(lock.tryReadLock()));
275 assertFalse(lock.validate(lock.tryReadLock(100L, MILLISECONDS)));
276 assertFalse(lock.validate(lock.tryOptimisticRead()));
277 lock.unlockWrite(s);
278 } catch (InterruptedException ie) {
279 threadUnexpectedException(ie);
280 }
281 }
282
283 /**
284 * writeLockInterruptibly is interruptible
285 */
286 public void testWriteLockInterruptibly_Interruptible() {
287 final CountDownLatch running = new CountDownLatch(1);
288 final StampedLock lock = new StampedLock();
289 long s = lock.writeLock();
290 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
291 public void realRun() throws InterruptedException {
292 running.countDown();
293 lock.writeLockInterruptibly();
294 }});
295 try {
296 running.await();
297 waitForThreadToEnterWaitState(t, 100);
298 t.interrupt();
299 awaitTermination(t);
300 releaseWriteLock(lock, s);
301 } catch (InterruptedException ie) {
302 threadUnexpectedException(ie);
303 }
304 }
305
306 /**
307 * timed tryWriteLock is interruptible
308 */
309 public void testWriteTryLock_Interruptible() {
310 final CountDownLatch running = new CountDownLatch(1);
311 final StampedLock lock = new StampedLock();
312 long s = lock.writeLock();
313 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
314 public void realRun() throws InterruptedException {
315 running.countDown();
316 lock.tryWriteLock(2 * LONG_DELAY_MS, MILLISECONDS);
317 }});
318 try {
319 running.await();
320 waitForThreadToEnterWaitState(t, 100);
321 t.interrupt();
322 awaitTermination(t);
323 releaseWriteLock(lock, s);
324 } catch (InterruptedException ie) {
325 threadUnexpectedException(ie);
326 }
327 }
328
329 /**
330 * readLockInterruptibly is interruptible
331 */
332 public void testReadLockInterruptibly_Interruptible() {
333 final CountDownLatch running = new CountDownLatch(1);
334 final StampedLock lock = new StampedLock();
335 long s = lock.writeLock();
336 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
337 public void realRun() throws InterruptedException {
338 running.countDown();
339 lock.readLockInterruptibly();
340 }});
341 try {
342 running.await();
343 waitForThreadToEnterWaitState(t, 100);
344 t.interrupt();
345 awaitTermination(t);
346 releaseWriteLock(lock, s);
347 } catch (InterruptedException ie) {
348 threadUnexpectedException(ie);
349 }
350 }
351
352 /**
353 * timed tryReadLock is interruptible
354 */
355 public void testReadTryLock_Interruptible() {
356 final CountDownLatch running = new CountDownLatch(1);
357 final StampedLock lock = new StampedLock();
358 long s = lock.writeLock();
359 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
360 public void realRun() throws InterruptedException {
361 running.countDown();
362 lock.tryReadLock(2 * LONG_DELAY_MS, MILLISECONDS);
363 }});
364 try {
365 running.await();
366 waitForThreadToEnterWaitState(t, 100);
367 t.interrupt();
368 awaitTermination(t);
369 releaseWriteLock(lock, s);
370 } catch (InterruptedException ie) {
371 threadUnexpectedException(ie);
372 }
373 }
374
375 /**
376 * tryWriteLock on an unlocked lock succeeds
377 */
378 public void testWriteTryLock() {
379 final StampedLock lock = new StampedLock();
380 long s = lock.tryWriteLock();
381 assertTrue(s != 0L);
382 assertTrue(lock.isWriteLocked());
383 long s2 = lock.tryWriteLock();
384 assertEquals(s2, 0L);
385 releaseWriteLock(lock, s);
386 }
387
388 /**
389 * tryWriteLock fails if locked
390 */
391 public void testWriteTryLockWhenLocked() {
392 final StampedLock lock = new StampedLock();
393 long s = lock.writeLock();
394 Thread t = newStartedThread(new CheckedRunnable() {
395 public void realRun() {
396 long ws = lock.tryWriteLock();
397 assertTrue(ws == 0L);
398 }});
399
400 awaitTermination(t);
401 releaseWriteLock(lock, s);
402 }
403
404 /**
405 * tryReadLock fails if write-locked
406 */
407 public void testReadTryLockWhenLocked() {
408 final StampedLock lock = new StampedLock();
409 long s = lock.writeLock();
410 Thread t = newStartedThread(new CheckedRunnable() {
411 public void realRun() {
412 long rs = lock.tryReadLock();
413 assertEquals(rs, 0L);
414 }});
415
416 awaitTermination(t);
417 releaseWriteLock(lock, s);
418 }
419
420 /**
421 * Multiple threads can hold a read lock when not write-locked
422 */
423 public void testMultipleReadLocks() {
424 final StampedLock lock = new StampedLock();
425 final long s = lock.readLock();
426 Thread t = newStartedThread(new CheckedRunnable() {
427 public void realRun() throws InterruptedException {
428 long s2 = lock.tryReadLock();
429 assertTrue(s2 != 0L);
430 lock.unlockRead(s2);
431 long s3 = lock.tryReadLock(LONG_DELAY_MS, MILLISECONDS);
432 assertTrue(s3 != 0L);
433 lock.unlockRead(s3);
434 long s4 = lock.readLock();
435 lock.unlockRead(s4);
436 }});
437
438 awaitTermination(t);
439 lock.unlockRead(s);
440 }
441
442 /**
443 * A writelock succeeds only after a reading thread unlocks
444 */
445 public void testWriteAfterReadLock() {
446 final CountDownLatch running = new CountDownLatch(1);
447 final StampedLock lock = new StampedLock();
448 long rs = lock.readLock();
449 Thread t = newStartedThread(new CheckedRunnable() {
450 public void realRun() {
451 running.countDown();
452 long s = lock.writeLock();
453 lock.unlockWrite(s);
454 }});
455 try {
456 running.await();
457 waitForThreadToEnterWaitState(t, 100);
458 assertFalse(lock.isWriteLocked());
459 lock.unlockRead(rs);
460 awaitTermination(t);
461 assertFalse(lock.isWriteLocked());
462 } catch (InterruptedException ie) {
463 threadUnexpectedException(ie);
464 }
465 }
466
467 /**
468 * A writelock succeeds only after reading threads unlock
469 */
470 public void testWriteAfterMultipleReadLocks() {
471 final StampedLock lock = new StampedLock();
472 long s = lock.readLock();
473 Thread t1 = newStartedThread(new CheckedRunnable() {
474 public void realRun() {
475 long rs = lock.readLock();
476 lock.unlockRead(rs);
477 }});
478 awaitTermination(t1);
479
480 Thread t2 = newStartedThread(new CheckedRunnable() {
481 public void realRun() {
482 long ws = lock.writeLock();
483 lock.unlockWrite(ws);
484 }});
485 assertFalse(lock.isWriteLocked());
486 lock.unlockRead(s);
487 awaitTermination(t2);
488 assertFalse(lock.isWriteLocked());
489 }
490
491 /**
492 * Readlocks succeed only after a writing thread unlocks
493 */
494 public void testReadAfterWriteLock() {
495 final StampedLock lock = new StampedLock();
496 final long s = lock.writeLock();
497 Thread t1 = newStartedThread(new CheckedRunnable() {
498 public void realRun() {
499 long rs = lock.readLock();
500 lock.unlockRead(rs);
501 }});
502 Thread t2 = newStartedThread(new CheckedRunnable() {
503 public void realRun() {
504 long rs = lock.readLock();
505 lock.unlockRead(rs);
506 }});
507
508 releaseWriteLock(lock, s);
509 awaitTermination(t1);
510 awaitTermination(t2);
511 }
512
513 /**
514 * tryReadLock succeeds if readlocked but not writelocked
515 */
516 public void testTryLockWhenReadLocked() {
517 final StampedLock lock = new StampedLock();
518 long s = lock.readLock();
519 Thread t = newStartedThread(new CheckedRunnable() {
520 public void realRun() {
521 long rs = lock.tryReadLock();
522 threadAssertTrue(rs != 0L);
523 lock.unlockRead(rs);
524 }});
525
526 awaitTermination(t);
527 lock.unlockRead(s);
528 }
529
530 /**
531 * tryWriteLock fails when readlocked
532 */
533 public void testWriteTryLockWhenReadLocked() {
534 final StampedLock lock = new StampedLock();
535 long s = lock.readLock();
536 Thread t = newStartedThread(new CheckedRunnable() {
537 public void realRun() {
538 long ws = lock.tryWriteLock();
539 threadAssertEquals(ws, 0L);
540 }});
541
542 awaitTermination(t);
543 lock.unlockRead(s);
544 }
545
546 /**
547 * timed tryWriteLock times out if locked
548 */
549 public void testWriteTryLock_Timeout() {
550 final StampedLock lock = new StampedLock();
551 long s = lock.writeLock();
552 Thread t = newStartedThread(new CheckedRunnable() {
553 public void realRun() throws InterruptedException {
554 long startTime = System.nanoTime();
555 long timeoutMillis = 10;
556 long ws = lock.tryWriteLock(timeoutMillis, MILLISECONDS);
557 assertEquals(ws, 0L);
558 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
559 }});
560
561 awaitTermination(t);
562 releaseWriteLock(lock, s);
563 }
564
565 /**
566 * timed tryReadLock times out if write-locked
567 */
568 public void testReadTryLock_Timeout() {
569 final StampedLock lock = new StampedLock();
570 long s = lock.writeLock();
571 Thread t = newStartedThread(new CheckedRunnable() {
572 public void realRun() throws InterruptedException {
573 long startTime = System.nanoTime();
574 long timeoutMillis = 10;
575 long rs = lock.tryReadLock(timeoutMillis, MILLISECONDS);
576 assertEquals(rs, 0L);
577 assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
578 }});
579
580 awaitTermination(t);
581 assertTrue(lock.isWriteLocked());
582 lock.unlockWrite(s);
583 }
584
585 /**
586 * writeLockInterruptibly succeeds if unlocked, else is interruptible
587 */
588 public void testWriteLockInterruptibly() {
589 final CountDownLatch running = new CountDownLatch(1);
590 final StampedLock lock = new StampedLock();
591 long s = 0L;
592 try {
593 s = lock.writeLockInterruptibly();
594 } catch (InterruptedException ie) {
595 threadUnexpectedException(ie);
596 }
597 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
598 public void realRun() throws InterruptedException {
599 running.countDown();
600 lock.writeLockInterruptibly();
601 }});
602
603 try {
604 running.await();
605 waitForThreadToEnterWaitState(t, 100);
606 t.interrupt();
607 assertTrue(lock.isWriteLocked());
608 awaitTermination(t);
609 releaseWriteLock(lock, s);
610 } catch (InterruptedException ie) {
611 threadUnexpectedException(ie);
612 }
613
614 }
615
616 /**
617 * readLockInterruptibly succeeds if lock free else is interruptible
618 */
619 public void testReadLockInterruptibly() {
620 final CountDownLatch running = new CountDownLatch(1);
621 final StampedLock lock = new StampedLock();
622 long s = 0L;
623 try {
624 s = lock.readLockInterruptibly();
625 lock.unlockRead(s);
626 s = lock.writeLockInterruptibly();
627 } catch (InterruptedException ie) {
628 threadUnexpectedException(ie);
629 }
630 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
631 public void realRun() throws InterruptedException {
632 running.countDown();
633 lock.readLockInterruptibly();
634 }});
635 try {
636 running.await();
637 waitForThreadToEnterWaitState(t, 100);
638 t.interrupt();
639 awaitTermination(t);
640 releaseWriteLock(lock, s);
641 } catch (InterruptedException ie) {
642 threadUnexpectedException(ie);
643 }
644 }
645
646 /**
647 * A serialized lock deserializes as unlocked
648 */
649 public void testSerialization() {
650 StampedLock lock = new StampedLock();
651 lock.writeLock();
652 StampedLock clone = serialClone(lock);
653 assertTrue(lock.isWriteLocked());
654 assertFalse(clone.isWriteLocked());
655 long s = clone.writeLock();
656 assertTrue(clone.isWriteLocked());
657 clone.unlockWrite(s);
658 assertFalse(clone.isWriteLocked());
659 }
660
661 /**
662 * toString indicates current lock state
663 */
664 public void testToString() {
665 StampedLock lock = new StampedLock();
666 assertTrue(lock.toString().contains("Unlocked"));
667 long s = lock.writeLock();
668 assertTrue(lock.toString().contains("Write-locked"));
669 lock.unlockWrite(s);
670 s = lock.readLock();
671 assertTrue(lock.toString().contains("Read-locks"));
672 }
673
674 /**
675 * tryOptimisticRead succeeds and validates if unlocked, fails if locked
676 */
677 public void testValidateOptimistic() {
678 try {
679 StampedLock lock = new StampedLock();
680 long s, p;
681 assertTrue((p = lock.tryOptimisticRead()) != 0L);
682 assertTrue(lock.validate(p));
683 assertTrue((s = lock.writeLock()) != 0L);
684 assertFalse((p = lock.tryOptimisticRead()) != 0L);
685 assertTrue(lock.validate(s));
686 lock.unlockWrite(s);
687 assertTrue((p = lock.tryOptimisticRead()) != 0L);
688 assertTrue(lock.validate(p));
689 assertTrue((s = lock.readLock()) != 0L);
690 assertTrue(lock.validate(s));
691 assertTrue((p = lock.tryOptimisticRead()) != 0L);
692 assertTrue(lock.validate(p));
693 lock.unlockRead(s);
694 assertTrue((s = lock.tryWriteLock()) != 0L);
695 assertTrue(lock.validate(s));
696 assertFalse((p = lock.tryOptimisticRead()) != 0L);
697 lock.unlockWrite(s);
698 assertTrue((s = lock.tryReadLock()) != 0L);
699 assertTrue(lock.validate(s));
700 assertTrue((p = lock.tryOptimisticRead()) != 0L);
701 lock.unlockRead(s);
702 assertTrue(lock.validate(p));
703 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
704 assertFalse((p = lock.tryOptimisticRead()) != 0L);
705 assertTrue(lock.validate(s));
706 lock.unlockWrite(s);
707 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
708 assertTrue(lock.validate(s));
709 assertTrue((p = lock.tryOptimisticRead()) != 0L);
710 lock.unlockRead(s);
711 assertTrue((p = lock.tryOptimisticRead()) != 0L);
712 } catch (InterruptedException ie) {
713 threadUnexpectedException(ie);
714 }
715 }
716
717 /**
718 * tryOptimisticRead stamp does not validate if a write lock intervenes
719 */
720 public void testValidateOptimisticWriteLocked() {
721 StampedLock lock = new StampedLock();
722 long s, p;
723 assertTrue((p = lock.tryOptimisticRead()) != 0L);
724 assertTrue((s = lock.writeLock()) != 0L);
725 assertFalse(lock.validate(p));
726 assertFalse((p = lock.tryOptimisticRead()) != 0L);
727 assertTrue(lock.validate(s));
728 lock.unlockWrite(s);
729 }
730
731 /**
732 * tryOptimisticRead stamp does not validate if a write lock
733 * intervenes in another thread
734 */
735 public void testValidateOptimisticWriteLocked2() {
736 final CountDownLatch running = new CountDownLatch(1);
737 final StampedLock lock = new StampedLock();
738 long s, p;
739 assertTrue((p = lock.tryOptimisticRead()) != 0L);
740 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
741 public void realRun() throws InterruptedException {
742 lock.writeLockInterruptibly();
743 running.countDown();
744 lock.writeLockInterruptibly();
745 }});
746 try {
747 running.await();
748 assertFalse(lock.validate(p));
749 assertFalse((p = lock.tryOptimisticRead()) != 0L);
750 t.interrupt();
751 awaitTermination(t);
752 } catch (InterruptedException ie) {
753 threadUnexpectedException(ie);
754 }
755 }
756
757 /**
758 * tryConvertToOptimisticRead succeeds and validates if successfully locked,
759 */
760 public void testTryConvertToOptimisticRead() {
761 try {
762 StampedLock lock = new StampedLock();
763 long s, p;
764 s = 0L;
765 assertFalse((p = lock.tryConvertToOptimisticRead(s)) != 0L);
766 assertTrue((s = lock.tryOptimisticRead()) != 0L);
767 assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
768 assertTrue((s = lock.writeLock()) != 0L);
769 assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
770 assertTrue(lock.validate(p));
771 assertTrue((s = lock.readLock()) != 0L);
772 assertTrue(lock.validate(s));
773 assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
774 assertTrue(lock.validate(p));
775 assertTrue((s = lock.tryWriteLock()) != 0L);
776 assertTrue(lock.validate(s));
777 assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
778 assertTrue(lock.validate(p));
779 assertTrue((s = lock.tryReadLock()) != 0L);
780 assertTrue(lock.validate(s));
781 assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
782 assertTrue(lock.validate(p));
783 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
784 assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
785 assertTrue(lock.validate(p));
786 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
787 assertTrue(lock.validate(s));
788 assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
789 assertTrue(lock.validate(p));
790 } catch (InterruptedException ie) {
791 threadUnexpectedException(ie);
792 }
793 }
794
795 /**
796 * tryConvertToReadLock succeeds and validates if successfully locked
797 * or lock free;
798 */
799 public void testTryConvertToReadLock() {
800 try {
801 StampedLock lock = new StampedLock();
802 long s, p;
803 s = 0L;
804 assertFalse((p = lock.tryConvertToReadLock(s)) != 0L);
805 assertTrue((s = lock.tryOptimisticRead()) != 0L);
806 assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
807 lock.unlockRead(p);
808 assertTrue((s = lock.writeLock()) != 0L);
809 assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
810 assertTrue(lock.validate(p));
811 lock.unlockRead(p);
812 assertTrue((s = lock.readLock()) != 0L);
813 assertTrue(lock.validate(s));
814 assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
815 assertTrue(lock.validate(p));
816 lock.unlockRead(p);
817 assertTrue((s = lock.tryWriteLock()) != 0L);
818 assertTrue(lock.validate(s));
819 assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
820 assertTrue(lock.validate(p));
821 lock.unlockRead(p);
822 assertTrue((s = lock.tryReadLock()) != 0L);
823 assertTrue(lock.validate(s));
824 assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
825 assertTrue(lock.validate(p));
826 lock.unlockRead(p);
827 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
828 assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
829 assertTrue(lock.validate(p));
830 lock.unlockRead(p);
831 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
832 assertTrue(lock.validate(s));
833 assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
834 assertTrue(lock.validate(p));
835 lock.unlockRead(p);
836 } catch (InterruptedException ie) {
837 threadUnexpectedException(ie);
838 }
839 }
840
841 /**
842 * tryConvertToWriteLock succeeds and validates if successfully locked
843 * or lock free;
844 */
845 public void testTryConvertToWriteLock() {
846 try {
847 StampedLock lock = new StampedLock();
848 long s, p;
849 s = 0L;
850 assertFalse((p = lock.tryConvertToWriteLock(s)) != 0L);
851 assertTrue((s = lock.tryOptimisticRead()) != 0L);
852 assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
853 lock.unlockWrite(p);
854 assertTrue((s = lock.writeLock()) != 0L);
855 assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
856 assertTrue(lock.validate(p));
857 lock.unlockWrite(p);
858 assertTrue((s = lock.readLock()) != 0L);
859 assertTrue(lock.validate(s));
860 assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
861 assertTrue(lock.validate(p));
862 lock.unlockWrite(p);
863 assertTrue((s = lock.tryWriteLock()) != 0L);
864 assertTrue(lock.validate(s));
865 assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
866 assertTrue(lock.validate(p));
867 lock.unlockWrite(p);
868 assertTrue((s = lock.tryReadLock()) != 0L);
869 assertTrue(lock.validate(s));
870 assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
871 assertTrue(lock.validate(p));
872 lock.unlockWrite(p);
873 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
874 assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
875 assertTrue(lock.validate(p));
876 lock.unlockWrite(p);
877 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
878 assertTrue(lock.validate(s));
879 assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
880 assertTrue(lock.validate(p));
881 lock.unlockWrite(p);
882 } catch (InterruptedException ie) {
883 threadUnexpectedException(ie);
884 }
885 }
886
887 /**
888 * asWriteLock can be locked and unlocked
889 */
890 public void testAsWriteLock() {
891 StampedLock sl = new StampedLock();
892 Lock lock = sl.asWriteLock();
893 lock.lock();
894 assertFalse(lock.tryLock());
895 lock.unlock();
896 assertTrue(lock.tryLock());
897 }
898
899 /**
900 * asReadLock can be locked and unlocked
901 */
902 public void testAsReadLock() {
903 StampedLock sl = new StampedLock();
904 Lock lock = sl.asReadLock();
905 lock.lock();
906 lock.unlock();
907 assertTrue(lock.tryLock());
908 }
909
910 /**
911 * asReadWriteLock.writeLock can be locked and unlocked
912 */
913 public void testAsReadWriteLockWriteLock() {
914 StampedLock sl = new StampedLock();
915 Lock lock = sl.asReadWriteLock().writeLock();
916 lock.lock();
917 assertFalse(lock.tryLock());
918 lock.unlock();
919 assertTrue(lock.tryLock());
920 }
921
922 /**
923 * asReadWriteLock.readLock can be locked and unlocked
924 */
925 public void testAsReadWriteLockReadLock() {
926 StampedLock sl = new StampedLock();
927 Lock lock = sl.asReadWriteLock().readLock();
928 lock.lock();
929 lock.unlock();
930 assertTrue(lock.tryLock());
931 }
932
933 }