ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/LockLoops.java
Revision: 1.6
Committed: Mon Sep 27 19:15:15 2010 UTC (13 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.5: +9 -9 lines
Log Message:
use blessed declaration modifier order

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     * http://creativecommons.org/licenses/publicdomain
5     */
6     /*
7 dl 1.1 * A simple test program. Feel free to play.
8     */
9    
10     import java.util.concurrent.*;
11     import java.util.concurrent.locks.*;
12     import java.util.*;
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     static boolean doFair = true;
22    
23     public static void main(String[] args) throws Exception {
24     int maxThreads = 100;
25     int iters = 1000000;
26     int replications = 1;
27    
28 jsr166 1.3 if (args.length > 0)
29 dl 1.1 maxThreads = Integer.parseInt(args[0]);
30    
31 jsr166 1.3 if (args.length > 1)
32 dl 1.1 iters = Integer.parseInt(args[1]);
33    
34 jsr166 1.3 if (args.length > 2)
35 dl 1.1 replications = Integer.parseInt(args[2]);
36    
37     rng.setSeed(3122688L);
38    
39     print = false;
40     System.out.println("Warmup...");
41     oneTest(3, 10000);
42     Thread.sleep(1000);
43     oneTest(2, 10000);
44     Thread.sleep(100);
45     oneTest(1, 100000);
46     Thread.sleep(100);
47     oneTest(1, 100000);
48     Thread.sleep(1000);
49     print = true;
50    
51     for (int i = 1; i <= maxThreads; ++i) {
52     for (int j = 0; j < replications; ++j) {
53     System.out.println("Threads:" + i);
54     oneTest(i, iters / i);
55     Thread.sleep(100);
56     }
57     }
58     pool.shutdown();
59     }
60    
61     static void oneTest(int nthreads, int iters) throws Exception {
62     int v = rng.next();
63    
64     if (print)
65     System.out.print("No shared vars ");
66     new NoLockLoop().test(v, nthreads, iters * 10);
67     Thread.sleep(10);
68    
69     if (print)
70     System.out.print("No Lock + volatile ");
71     new NoLockVolatileLoop().test(v, nthreads, iters);
72     Thread.sleep(10);
73    
74     if (doBuiltin) {
75     if (print)
76     System.out.print("builtin lock ");
77     new BuiltinLockLoop().test(v, nthreads, iters);
78     Thread.sleep(10);
79     }
80    
81     if (print)
82     System.out.print("ReentrantLock ");
83     new ReentrantLockLoop().test(v, nthreads, iters);
84     Thread.sleep(10);
85    
86     if (doReadWrite) {
87     if (print)
88     System.out.print("ReentrantWriteLock ");
89     new ReentrantWriteLockLoop().test(v, nthreads, iters);
90     Thread.sleep(10);
91    
92     if (print)
93     System.out.print("ReentrantReadWriteLock");
94     new ReentrantReadWriteLockLoop().test(v, nthreads, iters);
95     Thread.sleep(10);
96    
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    
112     if (doFair) {
113     if (print)
114     System.out.print("FairReentrantLock ");
115     new FairReentrantLockLoop().test(v, nthreads, iters);
116     Thread.sleep(10);
117    
118     if (doReadWrite) {
119     if (print)
120     System.out.print("FairRWriteLock ");
121     new FairReentrantWriteLockLoop().test(v, nthreads, iters);
122     Thread.sleep(10);
123    
124     if (print)
125     System.out.print("FairRReadWriteLock ");
126     new FairReentrantReadWriteLockLoop().test(v, nthreads, iters);
127     Thread.sleep(10);
128     }
129    
130     }
131    
132     }
133    
134 jsr166 1.6 abstract static class LockLoop implements Runnable {
135 dl 1.1 int v;
136     int iters;
137     volatile int result;
138     final LoopHelpers.BarrierTimer timer = new LoopHelpers.BarrierTimer();
139     CyclicBarrier barrier;
140    
141     final void test(int initialValue, int nthreads, int iters) throws Exception {
142     v = initialValue;
143     this.iters = iters;
144     barrier = new CyclicBarrier(nthreads+1, timer);
145 jsr166 1.3 for (int i = 0; i < nthreads; ++i)
146 dl 1.1 pool.execute(this);
147     barrier.await();
148     barrier.await();
149     long time = timer.getTime();
150     if (print) {
151     long tpi = time / (iters * nthreads);
152     System.out.print("\t" + LoopHelpers.rightJustify(tpi) + " ns per update");
153 jsr166 1.4 // double secs = (double) time / 1000000000.0;
154 dl 1.1 // System.out.print("\t " + secs + "s run time");
155     System.out.println();
156     }
157    
158     if (result == 0) // avoid overoptimization
159     System.out.println("useless result: " + result);
160     }
161     abstract int loop(int n);
162     public final void run() {
163     try {
164 jsr166 1.3 barrier.await();
165 dl 1.1 result += loop(iters);
166     barrier.await();
167     }
168 jsr166 1.3 catch (Exception ie) {
169     return;
170 dl 1.1 }
171     }
172    
173     }
174    
175     private static class BuiltinLockLoop extends LockLoop {
176     final int loop(int n) {
177     int sum = 0;
178     while (n-- > 0) {
179 jsr166 1.5 synchronized (this) {
180 dl 1.1 v = LoopHelpers.compute1(v);
181     }
182     sum += LoopHelpers.compute2(v);
183     }
184     return sum;
185     }
186     }
187    
188     private static class NoLockLoop extends LockLoop {
189     final int loop(int n) {
190     int sum = 0;
191     int y = v;
192     while (n-- > 0) {
193     y = LoopHelpers.compute1(y);
194     sum += LoopHelpers.compute2(y);
195     }
196     return sum;
197     }
198     }
199    
200     private static class NoLockVolatileLoop extends LockLoop {
201 jsr166 1.6 private volatile int vv;
202 dl 1.1 final int loop(int n) {
203     int sum = 0;
204     while (n-- > 0) {
205     int y = LoopHelpers.compute1(vv);
206     vv = y;
207     sum += LoopHelpers.compute2(y);
208     }
209     return sum;
210     }
211     }
212    
213     private static class ReentrantLockLoop extends LockLoop {
214 jsr166 1.6 private final ReentrantLock lock = new ReentrantLock();
215 dl 1.1 final int loop(int n) {
216     int sum = 0;
217     while (n-- > 0) {
218     lock.lock();
219     try {
220     v = LoopHelpers.compute1(v);
221     }
222     finally {
223     lock.unlock();
224     }
225     sum += LoopHelpers.compute2(v);
226     }
227     return sum;
228     }
229     }
230    
231     private static class FairReentrantLockLoop extends LockLoop {
232 jsr166 1.6 private final ReentrantLock lock = new ReentrantLock(true);
233 dl 1.1 final int loop(int n) {
234     int sum = 0;
235     while (n-- > 0) {
236     lock.lock();
237     try {
238     v = LoopHelpers.compute1(v);
239     }
240     finally {
241     lock.unlock();
242     }
243     sum += LoopHelpers.compute2(v);
244     }
245     return sum;
246     }
247     }
248    
249     private static class ReentrantWriteLockLoop extends LockLoop {
250 jsr166 1.6 private final Lock lock = new ReentrantReadWriteLock().writeLock();
251 dl 1.1 final int loop(int n) {
252     int sum = 0;
253     while (n-- > 0) {
254     lock.lock();
255     try {
256     v = LoopHelpers.compute1(v);
257     }
258     finally {
259     lock.unlock();
260     }
261     sum += LoopHelpers.compute2(v);
262     }
263     return sum;
264     }
265     }
266    
267     private static class ReentrantReadWriteLockLoop extends LockLoop {
268 jsr166 1.6 private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
269 dl 1.1 final int loop(int n) {
270     int sum = 0;
271     while (n-- > 0) {
272     int x;
273     lock.readLock().lock();
274     try {
275     x = LoopHelpers.compute1(v);
276     }
277     finally {
278     lock.readLock().unlock();
279     }
280     lock.writeLock().lock();
281     try {
282     v = x;
283     }
284     finally {
285     lock.writeLock().unlock();
286     }
287     sum += LoopHelpers.compute2(v);
288     }
289     return sum;
290     }
291     }
292    
293     private static class FairReentrantWriteLockLoop extends LockLoop {
294     final Lock lock = new ReentrantReadWriteLock(true).writeLock();
295     final int loop(int n) {
296     int sum = 0;
297     while (n-- > 0) {
298     lock.lock();
299     try {
300     v = LoopHelpers.compute1(v);
301     }
302     finally {
303     lock.unlock();
304     }
305     sum += LoopHelpers.compute2(v);
306     }
307     return sum;
308     }
309     }
310    
311     private static class SemaphoreLoop extends LockLoop {
312 jsr166 1.6 private final Semaphore sem = new Semaphore(1, false);
313 dl 1.1 final int loop(int n) {
314     int sum = 0;
315     try {
316     while (n-- > 0) {
317     sem.acquire();
318     try {
319     v = LoopHelpers.compute1(v);
320     }
321     finally {
322     sem.release();
323     }
324     sum += LoopHelpers.compute2(v);
325     }
326     }
327     catch (InterruptedException ie) {
328     return sum;
329     }
330     return sum;
331     }
332     }
333     private static class FairSemaphoreLoop extends LockLoop {
334 jsr166 1.6 private final Semaphore sem = new Semaphore(1, true);
335 dl 1.1 final int loop(int n) {
336     int sum = 0;
337     try {
338     while (n-- > 0) {
339     sem.acquire();
340     try {
341     v = LoopHelpers.compute1(v);
342     }
343     finally {
344     sem.release();
345     }
346     sum += LoopHelpers.compute2(v);
347     }
348     }
349     catch (InterruptedException ie) {
350     return sum;
351     }
352     return sum;
353     }
354     }
355    
356     private static class FairReentrantReadWriteLockLoop extends LockLoop {
357 jsr166 1.6 private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
358 dl 1.1 final int loop(int n) {
359     int sum = 0;
360     while (n-- > 0) {
361     int x;
362     lock.readLock().lock();
363     try {
364     x = LoopHelpers.compute1(v);
365     }
366     finally {
367     lock.readLock().unlock();
368     }
369     lock.writeLock().lock();
370     try {
371     v = x;
372     }
373     finally {
374     lock.writeLock().unlock();
375     }
376     sum += LoopHelpers.compute2(v);
377     }
378     return sum;
379     }
380     }
381    
382    
383     }