ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/LockLoops.java
Revision: 1.13
Committed: Wed Jun 8 20:11:01 2016 UTC (7 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.12: +30 -0 lines
Log Message:
add StampedLockReadWriteLoop

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.2 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.7 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.2 */
6     /*
7 dl 1.1 * A simple test program. Feel free to play.
8     */
9    
10 jsr166 1.9 import java.util.*;
11 dl 1.1 import java.util.concurrent.*;
12     import java.util.concurrent.locks.*;
13    
14     public final class LockLoops {
15     static final ExecutorService pool = Executors.newCachedThreadPool();
16     static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
17     static boolean print = false;
18     static boolean doBuiltin = true;
19     static boolean doReadWrite = true;
20     static boolean doSemaphore = true;
21 jsr166 1.12 static boolean doStampedLock = true;
22 jsr166 1.8 static boolean doFair = true;
23 dl 1.1
24     public static void main(String[] args) throws Exception {
25     int maxThreads = 100;
26     int iters = 1000000;
27     int replications = 1;
28    
29 jsr166 1.3 if (args.length > 0)
30 dl 1.1 maxThreads = Integer.parseInt(args[0]);
31    
32 jsr166 1.3 if (args.length > 1)
33 dl 1.1 iters = Integer.parseInt(args[1]);
34    
35 jsr166 1.3 if (args.length > 2)
36 dl 1.1 replications = Integer.parseInt(args[2]);
37    
38     rng.setSeed(3122688L);
39    
40     print = false;
41     System.out.println("Warmup...");
42     oneTest(3, 10000);
43     Thread.sleep(1000);
44     oneTest(2, 10000);
45     Thread.sleep(100);
46     oneTest(1, 100000);
47     Thread.sleep(100);
48     oneTest(1, 100000);
49     Thread.sleep(1000);
50     print = true;
51    
52     for (int i = 1; i <= maxThreads; ++i) {
53     for (int j = 0; j < replications; ++j) {
54     System.out.println("Threads:" + i);
55     oneTest(i, iters / i);
56     Thread.sleep(100);
57     }
58     }
59     pool.shutdown();
60     }
61    
62     static void oneTest(int nthreads, int iters) throws Exception {
63     int v = rng.next();
64    
65     if (print)
66     System.out.print("No shared vars ");
67     new NoLockLoop().test(v, nthreads, iters * 10);
68     Thread.sleep(10);
69    
70     if (print)
71     System.out.print("No Lock + volatile ");
72     new NoLockVolatileLoop().test(v, nthreads, iters);
73     Thread.sleep(10);
74    
75     if (doBuiltin) {
76     if (print)
77     System.out.print("builtin lock ");
78     new BuiltinLockLoop().test(v, nthreads, iters);
79     Thread.sleep(10);
80     }
81    
82     if (print)
83     System.out.print("ReentrantLock ");
84     new ReentrantLockLoop().test(v, nthreads, iters);
85     Thread.sleep(10);
86    
87     if (doReadWrite) {
88     if (print)
89     System.out.print("ReentrantWriteLock ");
90     new ReentrantWriteLockLoop().test(v, nthreads, iters);
91     Thread.sleep(10);
92    
93     if (print)
94     System.out.print("ReentrantReadWriteLock");
95     new ReentrantReadWriteLockLoop().test(v, nthreads, iters);
96     Thread.sleep(10);
97     }
98    
99     if (doSemaphore) {
100     if (print)
101     System.out.print("Semaphore ");
102     new SemaphoreLoop().test(v, nthreads, iters);
103     Thread.sleep(10);
104    
105     if (print)
106     System.out.print("FairSemaphore ");
107     new FairSemaphoreLoop().test(v, nthreads, iters);
108     Thread.sleep(10);
109     }
110    
111     if (doFair) {
112     if (print)
113     System.out.print("FairReentrantLock ");
114     new FairReentrantLockLoop().test(v, nthreads, iters);
115     Thread.sleep(10);
116    
117     if (doReadWrite) {
118     if (print)
119     System.out.print("FairRWriteLock ");
120     new FairReentrantWriteLockLoop().test(v, nthreads, iters);
121     Thread.sleep(10);
122    
123     if (print)
124     System.out.print("FairRReadWriteLock ");
125     new FairReentrantReadWriteLockLoop().test(v, nthreads, iters);
126     Thread.sleep(10);
127     }
128     }
129 jsr166 1.12
130     if (doStampedLock) {
131     if (print)
132     System.out.print("StampedLockWrite ");
133     new StampedLockWriteLoop().test(v, nthreads, iters);
134     Thread.sleep(10);
135    
136     if (print)
137     System.out.print("StampedLockRead ");
138     new StampedLockReadLoop().test(v, nthreads, iters);
139     Thread.sleep(10);
140 jsr166 1.13
141     if (print)
142     System.out.print("StampedLockReadWrite");
143     new StampedLockReadLoop().test(v, nthreads, iters);
144     Thread.sleep(10);
145 jsr166 1.12 }
146 dl 1.1 }
147    
148 jsr166 1.6 abstract static class LockLoop implements Runnable {
149 dl 1.1 int v;
150     int iters;
151     volatile int result;
152     final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
153     CyclicBarrier barrier;
154    
155     final void test(int initialValue, int nthreads, int iters) throws Exception {
156     v = initialValue;
157     this.iters = iters;
158     barrier = new CyclicBarrier(nthreads+1, timer);
159 jsr166 1.3 for (int i = 0; i < nthreads; ++i)
160 dl 1.1 pool.execute(this);
161     barrier.await();
162     barrier.await();
163     long time = timer.getTime();
164     if (print) {
165     long tpi = time / (iters * nthreads);
166     System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per update");
167 jsr166 1.4 // double secs = (double) time / 1000000000.0;
168 dl 1.1 // System.out.print("\t " + secs + "s run time");
169     System.out.println();
170     }
171    
172     if (result == 0) // avoid overoptimization
173     System.out.println("useless result: " + result);
174     }
175     abstract int loop(int n);
176     public final void run() {
177     try {
178 jsr166 1.3 barrier.await();
179 dl 1.1 result += loop(iters);
180     barrier.await();
181     }
182 jsr166 1.3 catch (Exception ie) {
183     return;
184 dl 1.1 }
185     }
186    
187     }
188    
189     private static class BuiltinLockLoop extends LockLoop {
190     final int loop(int n) {
191     int sum = 0;
192     while (n-- > 0) {
193 jsr166 1.5 synchronized (this) {
194 dl 1.1 v = LoopHelpers.compute1(v);
195     }
196     sum += LoopHelpers.compute2(v);
197     }
198     return sum;
199     }
200     }
201    
202     private static class NoLockLoop extends LockLoop {
203     final int loop(int n) {
204     int sum = 0;
205     int y = v;
206     while (n-- > 0) {
207     y = LoopHelpers.compute1(y);
208     sum += LoopHelpers.compute2(y);
209     }
210     return sum;
211     }
212     }
213    
214     private static class NoLockVolatileLoop extends LockLoop {
215 jsr166 1.6 private volatile int vv;
216 dl 1.1 final int loop(int n) {
217     int sum = 0;
218     while (n-- > 0) {
219     int y = LoopHelpers.compute1(vv);
220     vv = y;
221     sum += LoopHelpers.compute2(y);
222     }
223     return sum;
224     }
225     }
226    
227     private static class ReentrantLockLoop extends LockLoop {
228 jsr166 1.6 private final ReentrantLock lock = new ReentrantLock();
229 dl 1.1 final int loop(int n) {
230     int sum = 0;
231     while (n-- > 0) {
232     lock.lock();
233     try {
234     v = LoopHelpers.compute1(v);
235     }
236     finally {
237     lock.unlock();
238     }
239     sum += LoopHelpers.compute2(v);
240     }
241     return sum;
242     }
243     }
244    
245     private static class FairReentrantLockLoop extends LockLoop {
246 jsr166 1.6 private final ReentrantLock lock = new ReentrantLock(true);
247 dl 1.1 final int loop(int n) {
248     int sum = 0;
249     while (n-- > 0) {
250     lock.lock();
251     try {
252     v = LoopHelpers.compute1(v);
253     }
254     finally {
255     lock.unlock();
256     }
257     sum += LoopHelpers.compute2(v);
258     }
259     return sum;
260     }
261     }
262    
263     private static class ReentrantWriteLockLoop extends LockLoop {
264 jsr166 1.6 private final Lock lock = new ReentrantReadWriteLock().writeLock();
265 dl 1.1 final int loop(int n) {
266     int sum = 0;
267     while (n-- > 0) {
268     lock.lock();
269     try {
270     v = LoopHelpers.compute1(v);
271     }
272     finally {
273     lock.unlock();
274     }
275     sum += LoopHelpers.compute2(v);
276     }
277     return sum;
278     }
279     }
280    
281     private static class ReentrantReadWriteLockLoop extends LockLoop {
282 jsr166 1.6 private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
283 dl 1.1 final int loop(int n) {
284     int sum = 0;
285     while (n-- > 0) {
286     int x;
287     lock.readLock().lock();
288     try {
289     x = LoopHelpers.compute1(v);
290     }
291     finally {
292     lock.readLock().unlock();
293     }
294     lock.writeLock().lock();
295     try {
296     v = x;
297     }
298     finally {
299     lock.writeLock().unlock();
300     }
301     sum += LoopHelpers.compute2(v);
302     }
303     return sum;
304     }
305     }
306    
307     private static class FairReentrantWriteLockLoop extends LockLoop {
308     final Lock lock = new ReentrantReadWriteLock(true).writeLock();
309     final int loop(int n) {
310     int sum = 0;
311     while (n-- > 0) {
312     lock.lock();
313     try {
314     v = LoopHelpers.compute1(v);
315     }
316     finally {
317     lock.unlock();
318     }
319     sum += LoopHelpers.compute2(v);
320     }
321     return sum;
322     }
323     }
324    
325     private static class SemaphoreLoop extends LockLoop {
326 jsr166 1.6 private final Semaphore sem = new Semaphore(1, false);
327 dl 1.1 final int loop(int n) {
328     int sum = 0;
329     try {
330     while (n-- > 0) {
331     sem.acquire();
332     try {
333     v = LoopHelpers.compute1(v);
334     }
335     finally {
336     sem.release();
337     }
338     sum += LoopHelpers.compute2(v);
339     }
340     }
341     catch (InterruptedException ie) {
342     return sum;
343     }
344     return sum;
345     }
346     }
347 jsr166 1.12
348 dl 1.1 private static class FairSemaphoreLoop extends LockLoop {
349 jsr166 1.6 private final Semaphore sem = new Semaphore(1, true);
350 dl 1.1 final int loop(int n) {
351     int sum = 0;
352     try {
353     while (n-- > 0) {
354     sem.acquire();
355     try {
356     v = LoopHelpers.compute1(v);
357     }
358     finally {
359     sem.release();
360     }
361     sum += LoopHelpers.compute2(v);
362     }
363     }
364     catch (InterruptedException ie) {
365     return sum;
366     }
367     return sum;
368     }
369     }
370    
371     private static class FairReentrantReadWriteLockLoop extends LockLoop {
372 jsr166 1.6 private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
373 dl 1.1 final int loop(int n) {
374     int sum = 0;
375     while (n-- > 0) {
376     int x;
377     lock.readLock().lock();
378     try {
379     x = LoopHelpers.compute1(v);
380     }
381     finally {
382     lock.readLock().unlock();
383     }
384     lock.writeLock().lock();
385     try {
386     v = x;
387     }
388     finally {
389     lock.writeLock().unlock();
390     }
391     sum += LoopHelpers.compute2(v);
392     }
393     return sum;
394     }
395     }
396 jsr166 1.12
397     private static class StampedLockWriteLoop extends LockLoop {
398     private final StampedLock lock = new StampedLock();
399     final int loop(int n) {
400     int sum = 0;
401     while (n-- > 0) {
402     long stamp = lock.writeLock();
403     try {
404     v = LoopHelpers.compute1(v);
405     }
406     finally {
407     lock.unlockWrite(stamp);
408     }
409     sum += LoopHelpers.compute2(v);
410     }
411     return sum;
412     }
413     }
414    
415     private static class StampedLockReadLoop extends LockLoop {
416     private final StampedLock lock = new StampedLock();
417     final int loop(int n) {
418     int sum = 0;
419     while (n-- > 0) {
420     long stamp = lock.readLock();
421     try {
422     v = LoopHelpers.compute1(v);
423     }
424     finally {
425     lock.unlockRead(stamp);
426     }
427     sum += LoopHelpers.compute2(v);
428     }
429     return sum;
430     }
431     }
432 jsr166 1.13
433     private static class StampedLockReadWriteLoop extends LockLoop {
434     private final StampedLock lock = new StampedLock();
435     final int loop(int n) {
436     int sum = 0;
437     while (n-- > 0) {
438     int x;
439     long stamp = lock.readLock();
440     try {
441     x = LoopHelpers.compute1(v);
442     }
443     finally {
444     lock.unlockRead(stamp);
445     }
446     stamp = lock.writeLock();
447     try {
448     v = x;
449     } finally {
450     lock.unlockWrite(stamp);
451     }
452     sum += LoopHelpers.compute2(v);
453     }
454     return sum;
455     }
456     }
457 dl 1.1 }