--- jsr166/src/test/tck/StampedLockTest.java 2016/08/10 17:05:13 1.27 +++ jsr166/src/test/tck/StampedLockTest.java 2017/07/03 19:36:24 1.37 @@ -7,7 +7,6 @@ import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static java.util.concurrent.TimeUnit.SECONDS; import java.util.ArrayList; import java.util.List; @@ -17,7 +16,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.StampedLock; import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Function; import junit.framework.Test; @@ -84,12 +82,12 @@ public class StampedLockTest extends JSR List> readLockers() { List> readLockers = new ArrayList<>(); - readLockers.add((sl) -> sl.readLock()); - readLockers.add((sl) -> sl.tryReadLock()); - readLockers.add((sl) -> readLockInterruptiblyUninterrupted(sl)); - readLockers.add((sl) -> tryReadLockUninterrupted(sl, Long.MIN_VALUE, DAYS)); - readLockers.add((sl) -> tryReadLockUninterrupted(sl, 0L, DAYS)); - readLockers.add((sl) -> sl.tryConvertToReadLock(sl.tryOptimisticRead())); + readLockers.add(sl -> sl.readLock()); + readLockers.add(sl -> sl.tryReadLock()); + readLockers.add(sl -> readLockInterruptiblyUninterrupted(sl)); + readLockers.add(sl -> tryReadLockUninterrupted(sl, Long.MIN_VALUE, DAYS)); + readLockers.add(sl -> tryReadLockUninterrupted(sl, 0L, DAYS)); + readLockers.add(sl -> sl.tryConvertToReadLock(sl.tryOptimisticRead())); return readLockers; } @@ -105,12 +103,12 @@ public class StampedLockTest extends JSR List> writeLockers() { List> writeLockers = new ArrayList<>(); - writeLockers.add((sl) -> sl.writeLock()); - writeLockers.add((sl) -> sl.tryWriteLock()); - writeLockers.add((sl) -> writeLockInterruptiblyUninterrupted(sl)); - writeLockers.add((sl) -> tryWriteLockUninterrupted(sl, Long.MIN_VALUE, DAYS)); - writeLockers.add((sl) -> tryWriteLockUninterrupted(sl, 0L, DAYS)); - writeLockers.add((sl) -> sl.tryConvertToWriteLock(sl.tryOptimisticRead())); + writeLockers.add(sl -> sl.writeLock()); + writeLockers.add(sl -> sl.tryWriteLock()); + writeLockers.add(sl -> writeLockInterruptiblyUninterrupted(sl)); + writeLockers.add(sl -> tryWriteLockUninterrupted(sl, Long.MIN_VALUE, DAYS)); + writeLockers.add(sl -> tryWriteLockUninterrupted(sl, 0L, DAYS)); + writeLockers.add(sl -> sl.tryConvertToWriteLock(sl.tryOptimisticRead())); return writeLockers; } @@ -249,9 +247,11 @@ public class StampedLockTest extends JSR long s = assertNonZero(lock.writeLock()); assertTrue(lock.validate(s)); assertFalse(lock.validate(lock.tryWriteLock())); - assertFalse(lock.validate(lock.tryWriteLock(0L, SECONDS))); + assertFalse(lock.validate(lock.tryWriteLock(randomExpiredTimeout(), + randomTimeUnit()))); assertFalse(lock.validate(lock.tryReadLock())); - assertFalse(lock.validate(lock.tryReadLock(0L, SECONDS))); + assertFalse(lock.validate(lock.tryWriteLock(randomExpiredTimeout(), + randomTimeUnit()))); assertFalse(lock.validate(lock.tryOptimisticRead())); lock.unlockWrite(s); } @@ -273,7 +273,6 @@ public class StampedLockTest extends JSR * interruptible operations throw InterruptedException when pre-interrupted */ public void testInterruptibleOperationsThrowInterruptedExceptionWhenPreInterrupted() { - final CountDownLatch running = new CountDownLatch(1); final StampedLock lock = new StampedLock(); Action[] interruptibleLockActions = { @@ -338,7 +337,6 @@ public class StampedLockTest extends JSR * interruptible operations throw InterruptedException when write locked and interrupted */ public void testInterruptibleOperationsThrowInterruptedExceptionWriteLockedInterrupted() { - final CountDownLatch running = new CountDownLatch(1); final StampedLock lock = new StampedLock(); long s = lock.writeLock(); @@ -361,7 +359,6 @@ public class StampedLockTest extends JSR * interruptible operations throw InterruptedException when read locked and interrupted */ public void testInterruptibleOperationsThrowInterruptedExceptionReadLockedInterrupted() { - final CountDownLatch running = new CountDownLatch(1); final StampedLock lock = new StampedLock(); long s = lock.readLock(); @@ -480,29 +477,32 @@ public class StampedLockTest extends JSR } /** - * A writelock succeeds only after a reading thread unlocks + * writeLock() succeeds only after a reading thread unlocks */ public void testWriteAfterReadLock() throws InterruptedException { - final CountDownLatch running = new CountDownLatch(1); + final CountDownLatch aboutToLock = new CountDownLatch(1); final StampedLock lock = new StampedLock(); long rs = lock.readLock(); Thread t = newStartedThread(new CheckedRunnable() { public void realRun() { - running.countDown(); + aboutToLock.countDown(); long s = lock.writeLock(); + assertTrue(lock.isWriteLocked()); + assertFalse(lock.isReadLocked()); lock.unlockWrite(s); }}); - running.await(); - waitForThreadToEnterWaitState(t, MEDIUM_DELAY_MS); + await(aboutToLock); + assertThreadBlocks(t, Thread.State.WAITING); assertFalse(lock.isWriteLocked()); + assertTrue(lock.isReadLocked()); lock.unlockRead(rs); awaitTermination(t); - assertFalse(lock.isWriteLocked()); + assertUnlocked(lock); } /** - * A writelock succeeds only after reading threads unlock + * writeLock() succeeds only after reading threads unlock */ public void testWriteAfterMultipleReadLocks() { final StampedLock lock = new StampedLock(); @@ -525,35 +525,36 @@ public class StampedLockTest extends JSR assertFalse(lock.isWriteLocked()); lock.unlockRead(s); awaitTermination(t2); - assertFalse(lock.isWriteLocked()); + assertUnlocked(lock); } /** - * Readlocks succeed only after a writing thread unlocks + * readLock() succeed only after a writing thread unlocks */ public void testReadAfterWriteLock() { final StampedLock lock = new StampedLock(); final CountDownLatch threadsStarted = new CountDownLatch(2); final long s = lock.writeLock(); - Thread t1 = newStartedThread(new CheckedRunnable() { - public void realRun() { - threadsStarted.countDown(); - long rs = lock.readLock(); - lock.unlockRead(rs); - }}); - Thread t2 = newStartedThread(new CheckedRunnable() { + final Runnable acquireReleaseReadLock = new CheckedRunnable() { public void realRun() { threadsStarted.countDown(); long rs = lock.readLock(); + assertTrue(lock.isReadLocked()); + assertFalse(lock.isWriteLocked()); lock.unlockRead(rs); - }}); + }}; + Thread t1 = newStartedThread(acquireReleaseReadLock); + Thread t2 = newStartedThread(acquireReleaseReadLock); await(threadsStarted); - waitForThreadToEnterWaitState(t1, MEDIUM_DELAY_MS); - waitForThreadToEnterWaitState(t2, MEDIUM_DELAY_MS); + assertThreadBlocks(t1, Thread.State.WAITING); + assertThreadBlocks(t2, Thread.State.WAITING); + assertTrue(lock.isWriteLocked()); + assertFalse(lock.isReadLocked()); releaseWriteLock(lock, s); awaitTermination(t1); awaitTermination(t2); + assertUnlocked(lock); } /** @@ -739,22 +740,24 @@ public class StampedLockTest extends JSR */ public void testValidateOptimisticWriteLocked2() throws InterruptedException { - final CountDownLatch running = new CountDownLatch(1); + final CountDownLatch locked = new CountDownLatch(1); final StampedLock lock = new StampedLock(); final long p = assertValid(lock, lock.tryOptimisticRead()); Thread t = newStartedThread(new CheckedInterruptedRunnable() { public void realRun() throws InterruptedException { lock.writeLockInterruptibly(); - running.countDown(); + locked.countDown(); lock.writeLockInterruptibly(); }}); - running.await(); + await(locked); assertFalse(lock.validate(p)); assertEquals(0L, lock.tryOptimisticRead()); + assertThreadBlocks(t, Thread.State.WAITING); t.interrupt(); awaitTermination(t); + assertTrue(lock.isWriteLocked()); } /**