--- jsr166/src/test/loops/LockLoops.java 2016/06/08 20:11:01 1.13 +++ jsr166/src/test/loops/LockLoops.java 2016/06/09 15:28:19 1.15 @@ -3,8 +3,9 @@ * Expert Group and released to the public domain, as explained at * http://creativecommons.org/publicdomain/zero/1.0/ */ + /* - * A simple test program. Feel free to play. + * Simple benchmark comparing various locking techniques. */ import java.util.*; @@ -91,6 +92,11 @@ public final class LockLoops { Thread.sleep(10); if (print) + System.out.print("ReentrantReadLock "); + new ReentrantReadLockLoop().test(v, nthreads, iters); + Thread.sleep(10); + + if (print) System.out.print("ReentrantReadWriteLock"); new ReentrantReadWriteLockLoop().test(v, nthreads, iters); Thread.sleep(10); @@ -139,8 +145,13 @@ public final class LockLoops { Thread.sleep(10); if (print) + System.out.print("StampedLockOptRead"); + new StampedLockOptimisticReadLoop().test(v, nthreads, iters); + Thread.sleep(10); + + if (print) System.out.print("StampedLockReadWrite"); - new StampedLockReadLoop().test(v, nthreads, iters); + new StampedLockReadWriteLoop().test(v, nthreads, iters); Thread.sleep(10); } } @@ -278,6 +289,24 @@ public final class LockLoops { } } + private static class ReentrantReadLockLoop extends LockLoop { + private final Lock lock = new ReentrantReadWriteLock().readLock(); + final int loop(int n) { + int sum = 0; + while (n-- > 0) { + lock.lock(); + try { + v = LoopHelpers.compute1(v); + } + finally { + lock.unlock(); + } + sum += LoopHelpers.compute2(v); + } + return sum; + } + } + private static class ReentrantReadWriteLockLoop extends LockLoop { private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); final int loop(int n) { @@ -427,6 +456,22 @@ public final class LockLoops { sum += LoopHelpers.compute2(v); } return sum; + } + } + + private static class StampedLockOptimisticReadLoop extends LockLoop { + private final StampedLock lock = new StampedLock(); + final int loop(int n) { + int sum = 0; + while (n-- > 0) { + long stamp; + do { + stamp = lock.tryOptimisticRead(); + v = LoopHelpers.compute1(v); + } while (!lock.validate(stamp)); + sum += LoopHelpers.compute2(v); + } + return sum; } }