--- jsr166/src/test/tck/StampedLockTest.java 2016/06/07 00:03:27 1.15 +++ jsr166/src/test/tck/StampedLockTest.java 2016/06/07 23:28:30 1.24 @@ -718,28 +718,41 @@ public class StampedLockTest extends JSR public void testTryConvertToOptimisticRead() throws InterruptedException { StampedLock lock = new StampedLock(); long s, p; - s = 0L; - assertFalse((p = lock.tryConvertToOptimisticRead(s)) != 0L); + assertEquals(0L, lock.tryConvertToOptimisticRead(0L)); + assertTrue((s = lock.tryOptimisticRead()) != 0L); - assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L); + assertEquals(s, lock.tryConvertToOptimisticRead(s)); + assertTrue(lock.validate(s)); + + assertTrue((p = lock.readLock()) != 0L); + assertTrue((s = lock.tryOptimisticRead()) != 0L); + assertEquals(s, lock.tryConvertToOptimisticRead(s)); + assertTrue(lock.validate(s)); + lock.unlockRead(p); + assertTrue((s = lock.writeLock()) != 0L); assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue((s = lock.readLock()) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue((s = lock.tryWriteLock()) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue((s = lock.tryReadLock()) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L); assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToOptimisticRead(s)) != 0L); @@ -753,39 +766,67 @@ public class StampedLockTest extends JSR public void testTryConvertToReadLock() throws InterruptedException { StampedLock lock = new StampedLock(); long s, p; - s = 0L; - assertFalse((p = lock.tryConvertToReadLock(s)) != 0L); + + assertFalse((p = lock.tryConvertToReadLock(0L)) != 0L); + assertTrue((s = lock.tryOptimisticRead()) != 0L); assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); + assertTrue(lock.isReadLocked()); + assertEquals(1, lock.getReadLockCount()); lock.unlockRead(p); + + assertTrue((s = lock.tryOptimisticRead()) != 0L); + lock.readLock(); + assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); + assertTrue(lock.isReadLocked()); + assertEquals(2, lock.getReadLockCount()); + lock.unlockRead(p); + lock.unlockRead(p); + assertTrue((s = lock.writeLock()) != 0L); assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue(lock.isReadLocked()); + assertEquals(1, lock.getReadLockCount()); lock.unlockRead(p); + assertTrue((s = lock.readLock()) != 0L); assertTrue(lock.validate(s)); - assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); - assertTrue(lock.validate(p)); - lock.unlockRead(p); + assertEquals(s, lock.tryConvertToReadLock(s)); + assertTrue(lock.validate(s)); + assertTrue(lock.isReadLocked()); + assertEquals(1, lock.getReadLockCount()); + lock.unlockRead(s); + assertTrue((s = lock.tryWriteLock()) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); assertTrue(lock.validate(p)); + assertEquals(1, lock.getReadLockCount()); lock.unlockRead(p); + assertTrue((s = lock.tryReadLock()) != 0L); assertTrue(lock.validate(s)); - assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); - assertTrue(lock.validate(p)); - lock.unlockRead(p); + assertEquals(s, lock.tryConvertToReadLock(s)); + assertTrue(lock.validate(s)); + assertTrue(lock.isReadLocked()); + assertEquals(1, lock.getReadLockCount()); + lock.unlockRead(s); + assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L); assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue(lock.isReadLocked()); + assertEquals(1, lock.getReadLockCount()); lock.unlockRead(p); + assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L); assertTrue(lock.validate(s)); - assertTrue((p = lock.tryConvertToReadLock(s)) != 0L); - assertTrue(lock.validate(p)); - lock.unlockRead(p); + assertEquals(s, lock.tryConvertToReadLock(s)); + assertTrue(lock.validate(s)); + assertTrue(lock.isReadLocked()); + assertEquals(1, lock.getReadLockCount()); + lock.unlockRead(s); } /** @@ -795,38 +836,52 @@ public class StampedLockTest extends JSR public void testTryConvertToWriteLock() throws InterruptedException { StampedLock lock = new StampedLock(); long s, p; - s = 0L; - assertFalse((p = lock.tryConvertToWriteLock(s)) != 0L); + + assertFalse((p = lock.tryConvertToWriteLock(0L)) != 0L); + assertTrue((s = lock.tryOptimisticRead()) != 0L); assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L); + assertTrue(lock.isWriteLocked()); lock.unlockWrite(p); + assertTrue((s = lock.writeLock()) != 0L); - assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L); - assertTrue(lock.validate(p)); - lock.unlockWrite(p); + assertEquals(s, lock.tryConvertToWriteLock(s)); + assertTrue(lock.validate(s)); + assertTrue(lock.isWriteLocked()); + lock.unlockWrite(s); + assertTrue((s = lock.readLock()) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue(lock.isWriteLocked()); lock.unlockWrite(p); + assertTrue((s = lock.tryWriteLock()) != 0L); assertTrue(lock.validate(s)); - assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L); - assertTrue(lock.validate(p)); - lock.unlockWrite(p); + assertEquals(s, lock.tryConvertToWriteLock(s)); + assertTrue(lock.validate(s)); + assertTrue(lock.isWriteLocked()); + lock.unlockWrite(s); + assertTrue((s = lock.tryReadLock()) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue(lock.isWriteLocked()); lock.unlockWrite(p); + assertTrue((s = lock.tryWriteLock(100L, MILLISECONDS)) != 0L); assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue(lock.isWriteLocked()); lock.unlockWrite(p); + assertTrue((s = lock.tryReadLock(100L, MILLISECONDS)) != 0L); assertTrue(lock.validate(s)); assertTrue((p = lock.tryConvertToWriteLock(s)) != 0L); assertTrue(lock.validate(p)); + assertTrue(lock.isWriteLocked()); lock.unlockWrite(p); } @@ -888,4 +943,112 @@ public class StampedLockTest extends JSR () -> sl.asReadWriteLock().readLock().newCondition()); } + /** + * Passing optimistic read stamps to unlock operations result in + * IllegalMonitorStateException + */ + public void testCannotUnlockOptimisticReadStamps() { + Runnable[] actions = { + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryOptimisticRead(); + assertTrue(stamp != 0); + sl.unlockRead(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryOptimisticRead(); + sl.unlock(stamp); + }, + + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryOptimisticRead(); + sl.writeLock(); + sl.unlock(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryOptimisticRead(); + sl.readLock(); + sl.unlockRead(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryOptimisticRead(); + sl.readLock(); + sl.unlock(stamp); + }, + + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.writeLock()); + assertTrue(stamp != 0); + sl.writeLock(); + sl.unlockWrite(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.writeLock()); + sl.writeLock(); + sl.unlock(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.writeLock()); + sl.readLock(); + sl.unlockRead(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.writeLock()); + sl.readLock(); + sl.unlock(stamp); + }, + + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.readLock()); + assertTrue(stamp != 0); + sl.writeLock(); + sl.unlockWrite(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.readLock()); + sl.writeLock(); + sl.unlock(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.readLock()); + sl.readLock(); + sl.unlockRead(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + sl.readLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.readLock()); + assertTrue(stamp != 0); + sl.readLock(); + sl.unlockRead(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.readLock()); + sl.readLock(); + sl.unlock(stamp); + }, + () -> { + StampedLock sl = new StampedLock(); + sl.readLock(); + long stamp = sl.tryConvertToOptimisticRead(sl.readLock()); + sl.readLock(); + sl.unlock(stamp); + }, + }; + + assertThrows(IllegalMonitorStateException.class, actions); + } + }