ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/StampedLockTest.java
Revision: 1.22
Committed: Tue Jun 7 22:19:52 2016 UTC (7 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.21: +31 -11 lines
Log Message:
testTryConvertToReadLock: small improvements

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 jsr166 1.10 import static java.util.concurrent.TimeUnit.MILLISECONDS;
9    
10     import java.util.concurrent.CountDownLatch;
11 jsr166 1.1 import java.util.concurrent.locks.Lock;
12 jsr166 1.2 import java.util.concurrent.locks.StampedLock;
13 jsr166 1.10
14     import junit.framework.Test;
15     import junit.framework.TestSuite;
16 jsr166 1.1
17     public class StampedLockTest extends JSR166TestCase {
18     public static void main(String[] args) {
19 jsr166 1.13 main(suite(), args);
20 jsr166 1.1 }
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 jsr166 1.14 long s = lock.writeLock();
170     lock.unlockWrite(s);
171 dl 1.4 try {
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 jsr166 1.14 long s = lock.readLock();
183 dl 1.4 try {
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 jsr166 1.14 long s = lock.readLock();
195     lock.unlockRead(s);
196 dl 1.4 try {
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 jsr166 1.14 long s = lock.writeLock();
219 dl 1.4 try {
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 jsr166 1.11 public void testValidate() throws InterruptedException {
237     StampedLock lock = new StampedLock();
238     long s = lock.writeLock();
239     assertTrue(lock.validate(s));
240     lock.unlockWrite(s);
241     s = lock.readLock();
242     assertTrue(lock.validate(s));
243     lock.unlockRead(s);
244     assertTrue((s = lock.tryWriteLock()) != 0L);
245     assertTrue(lock.validate(s));
246     lock.unlockWrite(s);
247     assertTrue((s = lock.tryReadLock()) != 0L);
248     assertTrue(lock.validate(s));
249     lock.unlockRead(s);
250     assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
251     assertTrue(lock.validate(s));
252     lock.unlockWrite(s);
253     assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
254     assertTrue(lock.validate(s));
255     lock.unlockRead(s);
256     assertTrue((s = lock.tryOptimisticRead()) != 0L);
257 dl 1.4 }
258    
259     /**
260     * A stamp obtained from an unsuccessful lock operation does not validate
261     */
262 jsr166 1.11 public void testValidate2() throws InterruptedException {
263     StampedLock lock = new StampedLock();
264     long s;
265     assertTrue((s = lock.writeLock()) != 0L);
266     assertTrue(lock.validate(s));
267     assertFalse(lock.validate(lock.tryWriteLock()));
268     assertFalse(lock.validate(lock.tryWriteLock(10L, MILLISECONDS)));
269     assertFalse(lock.validate(lock.tryReadLock()));
270     assertFalse(lock.validate(lock.tryReadLock(10L, MILLISECONDS)));
271     assertFalse(lock.validate(lock.tryOptimisticRead()));
272     lock.unlockWrite(s);
273 dl 1.4 }
274    
275     /**
276     * writeLockInterruptibly is interruptible
277     */
278 jsr166 1.11 public void testWriteLockInterruptibly_Interruptible()
279     throws InterruptedException {
280 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
281     final StampedLock lock = new StampedLock();
282     long s = lock.writeLock();
283     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
284     public void realRun() throws InterruptedException {
285     running.countDown();
286     lock.writeLockInterruptibly();
287     }});
288 jsr166 1.12
289 jsr166 1.11 running.await();
290     waitForThreadToEnterWaitState(t, 100);
291     t.interrupt();
292     awaitTermination(t);
293     releaseWriteLock(lock, s);
294 dl 1.4 }
295    
296     /**
297     * timed tryWriteLock is interruptible
298     */
299 jsr166 1.11 public void testWriteTryLock_Interruptible() throws InterruptedException {
300 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
301     final StampedLock lock = new StampedLock();
302     long s = lock.writeLock();
303     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
304     public void realRun() throws InterruptedException {
305     running.countDown();
306     lock.tryWriteLock(2 * LONG_DELAY_MS, MILLISECONDS);
307     }});
308 jsr166 1.12
309 jsr166 1.11 running.await();
310     waitForThreadToEnterWaitState(t, 100);
311     t.interrupt();
312     awaitTermination(t);
313     releaseWriteLock(lock, s);
314 dl 1.4 }
315    
316     /**
317     * readLockInterruptibly is interruptible
318     */
319 jsr166 1.11 public void testReadLockInterruptibly_Interruptible()
320     throws InterruptedException {
321 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
322     final StampedLock lock = new StampedLock();
323     long s = lock.writeLock();
324     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
325     public void realRun() throws InterruptedException {
326     running.countDown();
327     lock.readLockInterruptibly();
328     }});
329 jsr166 1.12
330 jsr166 1.11 running.await();
331     waitForThreadToEnterWaitState(t, 100);
332     t.interrupt();
333     awaitTermination(t);
334     releaseWriteLock(lock, s);
335 dl 1.4 }
336    
337     /**
338     * timed tryReadLock is interruptible
339     */
340 jsr166 1.11 public void testReadTryLock_Interruptible() throws InterruptedException {
341 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
342     final StampedLock lock = new StampedLock();
343     long s = lock.writeLock();
344     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
345     public void realRun() throws InterruptedException {
346     running.countDown();
347     lock.tryReadLock(2 * LONG_DELAY_MS, MILLISECONDS);
348     }});
349 jsr166 1.12
350 jsr166 1.11 running.await();
351     waitForThreadToEnterWaitState(t, 100);
352     t.interrupt();
353     awaitTermination(t);
354     releaseWriteLock(lock, s);
355 dl 1.4 }
356    
357     /**
358     * tryWriteLock on an unlocked lock succeeds
359     */
360     public void testWriteTryLock() {
361     final StampedLock lock = new StampedLock();
362     long s = lock.tryWriteLock();
363     assertTrue(s != 0L);
364     assertTrue(lock.isWriteLocked());
365     long s2 = lock.tryWriteLock();
366     assertEquals(s2, 0L);
367     releaseWriteLock(lock, s);
368     }
369    
370     /**
371     * tryWriteLock fails if locked
372     */
373     public void testWriteTryLockWhenLocked() {
374     final StampedLock lock = new StampedLock();
375     long s = lock.writeLock();
376     Thread t = newStartedThread(new CheckedRunnable() {
377     public void realRun() {
378     long ws = lock.tryWriteLock();
379     assertTrue(ws == 0L);
380     }});
381 jsr166 1.12
382 dl 1.4 awaitTermination(t);
383     releaseWriteLock(lock, s);
384     }
385    
386     /**
387     * tryReadLock fails if write-locked
388     */
389     public void testReadTryLockWhenLocked() {
390     final StampedLock lock = new StampedLock();
391     long s = lock.writeLock();
392     Thread t = newStartedThread(new CheckedRunnable() {
393     public void realRun() {
394     long rs = lock.tryReadLock();
395     assertEquals(rs, 0L);
396     }});
397 jsr166 1.12
398 dl 1.4 awaitTermination(t);
399     releaseWriteLock(lock, s);
400     }
401    
402     /**
403     * Multiple threads can hold a read lock when not write-locked
404     */
405     public void testMultipleReadLocks() {
406     final StampedLock lock = new StampedLock();
407     final long s = lock.readLock();
408     Thread t = newStartedThread(new CheckedRunnable() {
409     public void realRun() throws InterruptedException {
410     long s2 = lock.tryReadLock();
411     assertTrue(s2 != 0L);
412     lock.unlockRead(s2);
413     long s3 = lock.tryReadLock(LONG_DELAY_MS, MILLISECONDS);
414     assertTrue(s3 != 0L);
415     lock.unlockRead(s3);
416     long s4 = lock.readLock();
417     lock.unlockRead(s4);
418     }});
419 jsr166 1.12
420 dl 1.4 awaitTermination(t);
421     lock.unlockRead(s);
422     }
423    
424     /**
425     * A writelock succeeds only after a reading thread unlocks
426     */
427 jsr166 1.11 public void testWriteAfterReadLock() throws InterruptedException {
428 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
429     final StampedLock lock = new StampedLock();
430     long rs = lock.readLock();
431     Thread t = newStartedThread(new CheckedRunnable() {
432     public void realRun() {
433     running.countDown();
434     long s = lock.writeLock();
435     lock.unlockWrite(s);
436     }});
437 jsr166 1.12
438 jsr166 1.11 running.await();
439     waitForThreadToEnterWaitState(t, 100);
440     assertFalse(lock.isWriteLocked());
441     lock.unlockRead(rs);
442     awaitTermination(t);
443     assertFalse(lock.isWriteLocked());
444 dl 1.4 }
445    
446     /**
447     * A writelock succeeds only after reading threads unlock
448     */
449     public void testWriteAfterMultipleReadLocks() {
450     final StampedLock lock = new StampedLock();
451     long s = lock.readLock();
452     Thread t1 = newStartedThread(new CheckedRunnable() {
453     public void realRun() {
454     long rs = lock.readLock();
455     lock.unlockRead(rs);
456     }});
457 jsr166 1.12
458 dl 1.4 awaitTermination(t1);
459    
460     Thread t2 = newStartedThread(new CheckedRunnable() {
461     public void realRun() {
462     long ws = lock.writeLock();
463     lock.unlockWrite(ws);
464     }});
465 jsr166 1.12
466 dl 1.4 assertFalse(lock.isWriteLocked());
467     lock.unlockRead(s);
468     awaitTermination(t2);
469     assertFalse(lock.isWriteLocked());
470     }
471    
472     /**
473     * Readlocks succeed only after a writing thread unlocks
474     */
475     public void testReadAfterWriteLock() {
476     final StampedLock lock = new StampedLock();
477     final long s = lock.writeLock();
478     Thread t1 = newStartedThread(new CheckedRunnable() {
479     public void realRun() {
480     long rs = lock.readLock();
481     lock.unlockRead(rs);
482     }});
483     Thread t2 = newStartedThread(new CheckedRunnable() {
484     public void realRun() {
485     long rs = lock.readLock();
486     lock.unlockRead(rs);
487     }});
488    
489     releaseWriteLock(lock, s);
490     awaitTermination(t1);
491     awaitTermination(t2);
492     }
493    
494     /**
495     * tryReadLock succeeds if readlocked but not writelocked
496     */
497     public void testTryLockWhenReadLocked() {
498     final StampedLock lock = new StampedLock();
499     long s = lock.readLock();
500     Thread t = newStartedThread(new CheckedRunnable() {
501     public void realRun() {
502     long rs = lock.tryReadLock();
503     threadAssertTrue(rs != 0L);
504     lock.unlockRead(rs);
505     }});
506    
507     awaitTermination(t);
508     lock.unlockRead(s);
509     }
510    
511     /**
512     * tryWriteLock fails when readlocked
513     */
514     public void testWriteTryLockWhenReadLocked() {
515     final StampedLock lock = new StampedLock();
516     long s = lock.readLock();
517     Thread t = newStartedThread(new CheckedRunnable() {
518     public void realRun() {
519     long ws = lock.tryWriteLock();
520     threadAssertEquals(ws, 0L);
521     }});
522    
523     awaitTermination(t);
524     lock.unlockRead(s);
525     }
526    
527     /**
528     * timed tryWriteLock times out if locked
529     */
530     public void testWriteTryLock_Timeout() {
531     final StampedLock lock = new StampedLock();
532     long s = lock.writeLock();
533     Thread t = newStartedThread(new CheckedRunnable() {
534     public void realRun() throws InterruptedException {
535     long startTime = System.nanoTime();
536     long timeoutMillis = 10;
537     long ws = lock.tryWriteLock(timeoutMillis, MILLISECONDS);
538     assertEquals(ws, 0L);
539     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
540     }});
541    
542     awaitTermination(t);
543     releaseWriteLock(lock, s);
544     }
545    
546     /**
547     * timed tryReadLock times out if write-locked
548     */
549     public void testReadTryLock_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 rs = lock.tryReadLock(timeoutMillis, MILLISECONDS);
557     assertEquals(rs, 0L);
558     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
559     }});
560 jsr166 1.7
561 dl 1.4 awaitTermination(t);
562     assertTrue(lock.isWriteLocked());
563     lock.unlockWrite(s);
564     }
565    
566     /**
567     * writeLockInterruptibly succeeds if unlocked, else is interruptible
568     */
569 jsr166 1.11 public void testWriteLockInterruptibly() throws InterruptedException {
570 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
571     final StampedLock lock = new StampedLock();
572 jsr166 1.11 long s = lock.writeLockInterruptibly();
573 dl 1.4 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
574     public void realRun() throws InterruptedException {
575     running.countDown();
576     lock.writeLockInterruptibly();
577     }});
578    
579 jsr166 1.11 running.await();
580     waitForThreadToEnterWaitState(t, 100);
581     t.interrupt();
582     assertTrue(lock.isWriteLocked());
583     awaitTermination(t);
584     releaseWriteLock(lock, s);
585 dl 1.4 }
586    
587     /**
588     * readLockInterruptibly succeeds if lock free else is interruptible
589     */
590 jsr166 1.11 public void testReadLockInterruptibly() throws InterruptedException {
591 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
592     final StampedLock lock = new StampedLock();
593 jsr166 1.11 long s;
594     s = lock.readLockInterruptibly();
595     lock.unlockRead(s);
596     s = lock.writeLockInterruptibly();
597 dl 1.4 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
598     public void realRun() throws InterruptedException {
599     running.countDown();
600     lock.readLockInterruptibly();
601     }});
602 jsr166 1.12
603 jsr166 1.11 running.await();
604     waitForThreadToEnterWaitState(t, 100);
605     t.interrupt();
606     awaitTermination(t);
607     releaseWriteLock(lock, s);
608 dl 1.4 }
609    
610     /**
611     * A serialized lock deserializes as unlocked
612     */
613     public void testSerialization() {
614     StampedLock lock = new StampedLock();
615     lock.writeLock();
616     StampedLock clone = serialClone(lock);
617     assertTrue(lock.isWriteLocked());
618     assertFalse(clone.isWriteLocked());
619     long s = clone.writeLock();
620     assertTrue(clone.isWriteLocked());
621     clone.unlockWrite(s);
622     assertFalse(clone.isWriteLocked());
623     }
624 dl 1.5
625 dl 1.4 /**
626     * toString indicates current lock state
627     */
628     public void testToString() {
629     StampedLock lock = new StampedLock();
630     assertTrue(lock.toString().contains("Unlocked"));
631     long s = lock.writeLock();
632     assertTrue(lock.toString().contains("Write-locked"));
633     lock.unlockWrite(s);
634     s = lock.readLock();
635     assertTrue(lock.toString().contains("Read-locks"));
636     }
637    
638     /**
639     * tryOptimisticRead succeeds and validates if unlocked, fails if locked
640     */
641 jsr166 1.11 public void testValidateOptimistic() throws InterruptedException {
642     StampedLock lock = new StampedLock();
643     long s, p;
644     assertTrue((p = lock.tryOptimisticRead()) != 0L);
645     assertTrue(lock.validate(p));
646     assertTrue((s = lock.writeLock()) != 0L);
647     assertFalse((p = lock.tryOptimisticRead()) != 0L);
648     assertTrue(lock.validate(s));
649     lock.unlockWrite(s);
650     assertTrue((p = lock.tryOptimisticRead()) != 0L);
651     assertTrue(lock.validate(p));
652     assertTrue((s = lock.readLock()) != 0L);
653     assertTrue(lock.validate(s));
654     assertTrue((p = lock.tryOptimisticRead()) != 0L);
655     assertTrue(lock.validate(p));
656     lock.unlockRead(s);
657     assertTrue((s = lock.tryWriteLock()) != 0L);
658     assertTrue(lock.validate(s));
659     assertFalse((p = lock.tryOptimisticRead()) != 0L);
660     lock.unlockWrite(s);
661     assertTrue((s = lock.tryReadLock()) != 0L);
662     assertTrue(lock.validate(s));
663     assertTrue((p = lock.tryOptimisticRead()) != 0L);
664     lock.unlockRead(s);
665     assertTrue(lock.validate(p));
666     assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
667     assertFalse((p = lock.tryOptimisticRead()) != 0L);
668     assertTrue(lock.validate(s));
669     lock.unlockWrite(s);
670     assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
671     assertTrue(lock.validate(s));
672     assertTrue((p = lock.tryOptimisticRead()) != 0L);
673     lock.unlockRead(s);
674     assertTrue((p = lock.tryOptimisticRead()) != 0L);
675 dl 1.4 }
676    
677     /**
678     * tryOptimisticRead stamp does not validate if a write lock intervenes
679     */
680     public void testValidateOptimisticWriteLocked() {
681     StampedLock lock = new StampedLock();
682     long s, p;
683     assertTrue((p = lock.tryOptimisticRead()) != 0L);
684     assertTrue((s = lock.writeLock()) != 0L);
685     assertFalse(lock.validate(p));
686     assertFalse((p = lock.tryOptimisticRead()) != 0L);
687     assertTrue(lock.validate(s));
688     lock.unlockWrite(s);
689     }
690    
691     /**
692     * tryOptimisticRead stamp does not validate if a write lock
693     * intervenes in another thread
694     */
695 jsr166 1.11 public void testValidateOptimisticWriteLocked2()
696     throws InterruptedException {
697 dl 1.4 final CountDownLatch running = new CountDownLatch(1);
698     final StampedLock lock = new StampedLock();
699     long s, p;
700     assertTrue((p = lock.tryOptimisticRead()) != 0L);
701     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
702 jsr166 1.11 public void realRun() throws InterruptedException {
703     lock.writeLockInterruptibly();
704     running.countDown();
705     lock.writeLockInterruptibly();
706     }});
707 jsr166 1.12
708 jsr166 1.11 running.await();
709     assertFalse(lock.validate(p));
710     assertFalse((p = lock.tryOptimisticRead()) != 0L);
711     t.interrupt();
712     awaitTermination(t);
713 dl 1.4 }
714    
715     /**
716     * tryConvertToOptimisticRead succeeds and validates if successfully locked,
717     */
718 jsr166 1.11 public void testTryConvertToOptimisticRead() throws InterruptedException {
719     StampedLock lock = new StampedLock();
720     long s, p;
721 jsr166 1.19 assertEquals(0L, lock.tryConvertToOptimisticRead(0L));
722    
723 jsr166 1.11 assertTrue((s = lock.tryOptimisticRead()) != 0L);
724 jsr166 1.19 assertEquals(s, lock.tryConvertToOptimisticRead(s));
725     assertTrue(lock.validate(s));
726    
727 jsr166 1.20 assertTrue((p = lock.readLock()) != 0L);
728     assertTrue((s = lock.tryOptimisticRead()) != 0L);
729     assertEquals(s, lock.tryConvertToOptimisticRead(s));
730     assertTrue(lock.validate(s));
731     lock.unlockRead(p);
732    
733 jsr166 1.11 assertTrue((s = lock.writeLock()) != 0L);
734     assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
735     assertTrue(lock.validate(p));
736 jsr166 1.19
737 jsr166 1.11 assertTrue((s = lock.readLock()) != 0L);
738     assertTrue(lock.validate(s));
739     assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
740     assertTrue(lock.validate(p));
741 jsr166 1.19
742 jsr166 1.11 assertTrue((s = lock.tryWriteLock()) != 0L);
743     assertTrue(lock.validate(s));
744     assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
745     assertTrue(lock.validate(p));
746 jsr166 1.19
747 jsr166 1.11 assertTrue((s = lock.tryReadLock()) != 0L);
748     assertTrue(lock.validate(s));
749     assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
750     assertTrue(lock.validate(p));
751 jsr166 1.19
752 jsr166 1.11 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
753     assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
754     assertTrue(lock.validate(p));
755 jsr166 1.19
756 jsr166 1.11 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
757     assertTrue(lock.validate(s));
758     assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L);
759     assertTrue(lock.validate(p));
760 dl 1.4 }
761    
762     /**
763     * tryConvertToReadLock succeeds and validates if successfully locked
764     * or lock free;
765     */
766 jsr166 1.11 public void testTryConvertToReadLock() throws InterruptedException {
767     StampedLock lock = new StampedLock();
768     long s, p;
769 jsr166 1.22
770     assertFalse((p = lock.tryConvertToReadLock(0L)) != 0L);
771    
772 jsr166 1.11 assertTrue((s = lock.tryOptimisticRead()) != 0L);
773     assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
774 jsr166 1.22 assertTrue(lock.isReadLocked());
775     assertEquals(1, lock.getReadLockCount());
776 jsr166 1.11 lock.unlockRead(p);
777 jsr166 1.22
778 jsr166 1.11 assertTrue((s = lock.writeLock()) != 0L);
779     assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
780     assertTrue(lock.validate(p));
781 jsr166 1.22 assertTrue(lock.isReadLocked());
782     assertEquals(1, lock.getReadLockCount());
783 jsr166 1.11 lock.unlockRead(p);
784 jsr166 1.22
785 jsr166 1.11 assertTrue((s = lock.readLock()) != 0L);
786     assertTrue(lock.validate(s));
787 jsr166 1.22 assertEquals(s, lock.tryConvertToReadLock(s));
788     assertTrue(lock.validate(s));
789     assertTrue(lock.isReadLocked());
790     assertEquals(1, lock.getReadLockCount());
791     lock.unlockRead(s);
792    
793 jsr166 1.11 assertTrue((s = lock.tryWriteLock()) != 0L);
794     assertTrue(lock.validate(s));
795     assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
796     assertTrue(lock.validate(p));
797 jsr166 1.22 assertEquals(1, lock.getReadLockCount());
798 jsr166 1.11 lock.unlockRead(p);
799 jsr166 1.22
800 jsr166 1.11 assertTrue((s = lock.tryReadLock()) != 0L);
801     assertTrue(lock.validate(s));
802 jsr166 1.22 assertEquals(s, lock.tryConvertToReadLock(s));
803     assertTrue(lock.validate(s));
804     assertTrue(lock.isReadLocked());
805     assertEquals(1, lock.getReadLockCount());
806     lock.unlockRead(s);
807    
808 jsr166 1.11 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
809     assertTrue((p = lock.tryConvertToReadLock(s)) != 0L);
810     assertTrue(lock.validate(p));
811 jsr166 1.22 assertTrue(lock.isReadLocked());
812     assertEquals(1, lock.getReadLockCount());
813 jsr166 1.11 lock.unlockRead(p);
814 jsr166 1.22
815 jsr166 1.11 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
816     assertTrue(lock.validate(s));
817 jsr166 1.22 assertEquals(s, lock.tryConvertToReadLock(s));
818     assertTrue(lock.validate(s));
819     assertTrue(lock.isReadLocked());
820     assertEquals(1, lock.getReadLockCount());
821     lock.unlockRead(s);
822 dl 1.4 }
823    
824     /**
825     * tryConvertToWriteLock succeeds and validates if successfully locked
826     * or lock free;
827     */
828 jsr166 1.11 public void testTryConvertToWriteLock() throws InterruptedException {
829     StampedLock lock = new StampedLock();
830     long s, p;
831 jsr166 1.21
832     assertFalse((p = lock.tryConvertToWriteLock(0L)) != 0L);
833    
834 jsr166 1.11 assertTrue((s = lock.tryOptimisticRead()) != 0L);
835     assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
836     lock.unlockWrite(p);
837 jsr166 1.21
838 jsr166 1.11 assertTrue((s = lock.writeLock()) != 0L);
839 jsr166 1.21 assertEquals(s, lock.tryConvertToWriteLock(s));
840     assertTrue(lock.validate(s));
841     lock.unlockWrite(s);
842    
843 jsr166 1.11 assertTrue((s = lock.readLock()) != 0L);
844     assertTrue(lock.validate(s));
845     assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
846     assertTrue(lock.validate(p));
847     lock.unlockWrite(p);
848 jsr166 1.21
849 jsr166 1.11 assertTrue((s = lock.tryWriteLock()) != 0L);
850     assertTrue(lock.validate(s));
851 jsr166 1.21 assertEquals(s, lock.tryConvertToWriteLock(s));
852     assertTrue(lock.validate(s));
853     lock.unlockWrite(s);
854    
855 jsr166 1.11 assertTrue((s = lock.tryReadLock()) != 0L);
856     assertTrue(lock.validate(s));
857     assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
858     assertTrue(lock.validate(p));
859     lock.unlockWrite(p);
860 jsr166 1.21
861 jsr166 1.11 assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L);
862     assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
863     assertTrue(lock.validate(p));
864     lock.unlockWrite(p);
865 jsr166 1.21
866 jsr166 1.11 assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L);
867     assertTrue(lock.validate(s));
868     assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L);
869     assertTrue(lock.validate(p));
870     lock.unlockWrite(p);
871 dl 1.4 }
872    
873     /**
874     * asWriteLock can be locked and unlocked
875     */
876     public void testAsWriteLock() {
877     StampedLock sl = new StampedLock();
878     Lock lock = sl.asWriteLock();
879     lock.lock();
880     assertFalse(lock.tryLock());
881     lock.unlock();
882     assertTrue(lock.tryLock());
883     }
884    
885     /**
886     * asReadLock can be locked and unlocked
887     */
888     public void testAsReadLock() {
889     StampedLock sl = new StampedLock();
890     Lock lock = sl.asReadLock();
891     lock.lock();
892     lock.unlock();
893     assertTrue(lock.tryLock());
894     }
895    
896     /**
897     * asReadWriteLock.writeLock can be locked and unlocked
898     */
899     public void testAsReadWriteLockWriteLock() {
900     StampedLock sl = new StampedLock();
901     Lock lock = sl.asReadWriteLock().writeLock();
902     lock.lock();
903     assertFalse(lock.tryLock());
904     lock.unlock();
905     assertTrue(lock.tryLock());
906     }
907    
908     /**
909     * asReadWriteLock.readLock can be locked and unlocked
910     */
911     public void testAsReadWriteLockReadLock() {
912     StampedLock sl = new StampedLock();
913     Lock lock = sl.asReadWriteLock().readLock();
914     lock.lock();
915     lock.unlock();
916     assertTrue(lock.tryLock());
917     }
918 jsr166 1.1
919 jsr166 1.15 /**
920     * Lock.newCondition throws UnsupportedOperationException
921     */
922     public void testLockViewsDoNotSupportConditions() {
923     StampedLock sl = new StampedLock();
924     assertThrows(UnsupportedOperationException.class,
925     () -> sl.asWriteLock().newCondition(),
926     () -> sl.asReadLock().newCondition(),
927     () -> sl.asReadWriteLock().writeLock().newCondition(),
928     () -> sl.asReadWriteLock().readLock().newCondition());
929     }
930    
931 jsr166 1.16 /**
932     * Passing optimistic read stamps to unlock operations result in
933     * IllegalMonitorStateException
934     */
935     public void testCannotUnlockOptimisticReadStamps() {
936     Runnable[] actions = {
937     () -> {
938     StampedLock sl = new StampedLock();
939     long stamp = sl.tryOptimisticRead();
940     assertTrue(stamp != 0);
941     sl.unlockRead(stamp);
942     },
943     () -> {
944     StampedLock sl = new StampedLock();
945     long stamp = sl.tryOptimisticRead();
946     sl.unlock(stamp);
947     },
948    
949     () -> {
950     StampedLock sl = new StampedLock();
951     long stamp = sl.tryOptimisticRead();
952     sl.writeLock();
953     sl.unlock(stamp);
954     },
955     () -> {
956     StampedLock sl = new StampedLock();
957     long stamp = sl.tryOptimisticRead();
958     sl.readLock();
959     sl.unlockRead(stamp);
960     },
961     () -> {
962     StampedLock sl = new StampedLock();
963     long stamp = sl.tryOptimisticRead();
964     sl.readLock();
965     sl.unlock(stamp);
966     },
967    
968     () -> {
969     StampedLock sl = new StampedLock();
970     long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
971     assertTrue(stamp != 0);
972     sl.writeLock();
973     sl.unlockWrite(stamp);
974     },
975     () -> {
976     StampedLock sl = new StampedLock();
977     long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
978     sl.writeLock();
979     sl.unlock(stamp);
980     },
981     () -> {
982     StampedLock sl = new StampedLock();
983     long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
984     sl.readLock();
985     sl.unlockRead(stamp);
986     },
987     () -> {
988     StampedLock sl = new StampedLock();
989     long stamp = sl.tryConvertToOptimisticRead(sl.writeLock());
990     sl.readLock();
991     sl.unlock(stamp);
992     },
993    
994     () -> {
995     StampedLock sl = new StampedLock();
996     long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
997     assertTrue(stamp != 0);
998     sl.writeLock();
999     sl.unlockWrite(stamp);
1000     },
1001     () -> {
1002     StampedLock sl = new StampedLock();
1003     long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
1004     sl.writeLock();
1005     sl.unlock(stamp);
1006     },
1007     () -> {
1008     StampedLock sl = new StampedLock();
1009     long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
1010     sl.readLock();
1011     sl.unlockRead(stamp);
1012     },
1013     () -> {
1014     StampedLock sl = new StampedLock();
1015 jsr166 1.18 sl.readLock();
1016     long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
1017     assertTrue(stamp != 0);
1018     sl.readLock();
1019     sl.unlockRead(stamp);
1020     },
1021     () -> {
1022     StampedLock sl = new StampedLock();
1023     long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
1024     sl.readLock();
1025     sl.unlock(stamp);
1026     },
1027     () -> {
1028     StampedLock sl = new StampedLock();
1029     sl.readLock();
1030 jsr166 1.16 long stamp = sl.tryConvertToOptimisticRead(sl.readLock());
1031     sl.readLock();
1032     sl.unlock(stamp);
1033     },
1034     };
1035 jsr166 1.17
1036 jsr166 1.16 assertThrows(IllegalMonitorStateException.class, actions);
1037     }
1038    
1039 jsr166 1.1 }