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

# User Rev Content
1 jsr166 1.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 jsr166 1.2 import java.util.concurrent.locks.StampedLock;
12 jsr166 1.1 import java.util.concurrent.CountDownLatch;
13     import static java.util.concurrent.TimeUnit.MILLISECONDS;
14     import java.util.*;
15 dl 1.4 import java.util.concurrent.*;
16 jsr166 1.1
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 dl 1.4 /**
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 dl 1.6 running.await();
297     waitForThreadToEnterWaitState(t, 100);
298 dl 1.4 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 dl 1.6 running.await();
320     waitForThreadToEnterWaitState(t, 100);
321 dl 1.4 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 dl 1.6 running.await();
343     waitForThreadToEnterWaitState(t, 100);
344 dl 1.4 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 dl 1.6 running.await();
366     waitForThreadToEnterWaitState(t, 100);
367 dl 1.4 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 dl 1.6 running.await();
457     waitForThreadToEnterWaitState(t, 100);
458 dl 1.4 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 dl 1.6 running.await();
605     waitForThreadToEnterWaitState(t, 100);
606 dl 1.4 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 dl 1.6 running.await();
637     waitForThreadToEnterWaitState(t, 100);
638 dl 1.4 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 dl 1.5
661 dl 1.4 /**
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 jsr166 1.1
933     }