ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/RLJBar.java
Revision: 1.9
Committed: Wed Dec 31 17:00:58 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.8: +0 -1 lines
Log Message:
lexicographic import order

File Contents

# User Rev Content
1 dl 1.2 /*
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.6 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.2 */
6    
7 dl 1.1 // Yet another contended object monitor throughput test
8     // adapted from bug reports
9    
10     import java.util.*;
11     import java.util.concurrent.*;
12     import java.util.concurrent.locks.*;
13 jsr166 1.3
14     class Producer extends Thread
15 dl 1.1 {
16     // private static Hashtable buddiesOnline = new Hashtable();
17 jsr166 1.7 private static Map buddiesOnline = new ConcurrentHashMap();
18     public Producer(String name) { super(name); }
19 dl 1.1
20 jsr166 1.7 public void run() {
21     Object key = null;
22     final ReentrantLock dr = RLJBar.DeathRow;
23     final ReentrantLock bar = RLJBar.bar;
24     final ReentrantLock end = RLJBar.End;
25     final Condition endCondition = RLJBar.EndCondition;
26     if (RLJBar.OneKey) key = new Integer(0); // per-thread v. per iteration
27    
28     // The barrier has a number of interesting effects:
29     // 1. It enforces full LWP provisioning on T1.
30     // (nearly all workers park concurrently).
31     // 2. It gives the C2 compiler thread(s) a chance to run.
32     // By transiently quiescing the workings the C2 threads
33     // might avoid starvation.
34     //
35    
36     try {
37     bar.lock();
38     try {
39     ++RLJBar.nUp;
40     if (RLJBar.nUp == RLJBar.nThreads) {
41     if (RLJBar.quiesce != 0) {
42     RLJBar.barCondition.awaitNanos(RLJBar.quiesce * 1000000);
43     }
44     RLJBar.epoch = System.currentTimeMillis();
45     RLJBar.barCondition.signalAll();
46     // System.out.print ("Consensus ");
47     }
48     if (RLJBar.UseBar) {
49     while (RLJBar.nUp != RLJBar.nThreads) {
50     RLJBar.barCondition.await();
51     }
52     }
53     }
54     finally {
55     bar.unlock();
56     }
57     } catch (Exception ex) {
58     System.out.println("Exception in barrier: " + ex);
59     }
60    
61     // Main execution time ... the code being timed ...
62     // HashTable.get() is highly contended (serial).
63     for (int loop = 1; loop < 100000 ;loop++) {
64     if (!RLJBar.OneKey) key = new Integer(0);
65     buddiesOnline.get(key);
66     }
67    
68     // Mutator epilog:
69     // The following code determines if the test will/wont include (measure)
70     // thread death time.
71    
72     end.lock();
73     try {
74     ++RLJBar.nDead;
75     if (RLJBar.nDead == RLJBar.nUp) {
76     // System.out.print((System.currentTimeMillis()-RLJBar.epoch) + " ms");
77     endCondition.signalAll();
78     }
79     }
80     finally {
81     end.unlock();
82     }
83     dr.lock();
84     dr.unlock();
85 dl 1.1 }
86     }
87    
88    
89 jsr166 1.4 public class RLJBar // ProdConsTest
90 dl 1.1 {
91    
92     public static final int ITERS = 10;
93 jsr166 1.7 public static boolean OneKey = false; // alloc once or once per iteration
94 dl 1.1
95 jsr166 1.7 public static boolean UseBar = false;
96     public static int nThreads = 100;
97     public static int nUp = 0;
98     public static int nDead = 0;
99     public static ReentrantLock bar = new ReentrantLock();
100     public static Condition barCondition = bar.newCondition();
101     public static long epoch;
102     public static ReentrantLock DeathRow = new ReentrantLock();
103     public static ReentrantLock End = new ReentrantLock();
104     public static int quiesce = 0;
105     public static Condition EndCondition = End.newCondition();
106    
107 jsr166 1.8 public static void main(String[] args) {
108 jsr166 1.7 int argix = 0;
109     if (argix < args.length && args[argix].equals("-o")) {
110     ++argix;
111     OneKey = true;
112     System.out.println("OneKey");
113     }
114     if (argix < args.length && args[argix].equals ("-b")) {
115     ++argix;
116     UseBar = true;
117     System.out.println("UseBar");
118     }
119     if (argix < args.length && args[argix].equals ("-q")) {
120     ++argix;
121     if (argix < args.length) {
122     quiesce = Integer.parseInt(args[argix++]);
123     System.out.println("Quiesce " + quiesce + " msecs");
124     }
125     }
126     for (int k = 0; k < ITERS; ++k)
127     oneRun();
128     }
129 dl 1.1
130     public static void oneRun() {
131 jsr166 1.5 DeathRow = new ReentrantLock();
132     End = new ReentrantLock();
133 dl 1.1 EndCondition = End.newCondition();
134 jsr166 1.3
135 jsr166 1.5 nDead = nUp = 0;
136     long cyBase = System.currentTimeMillis();
137 dl 1.1 DeathRow.lock();
138     try {
139 jsr166 1.5 for (int i = 1; i <= nThreads; i++) {
140 dl 1.1 new Producer("Producer" + i).start();
141     }
142 jsr166 1.3 try {
143 dl 1.1 End.lock();
144     try {
145 jsr166 1.3 while (nDead != nThreads)
146 jsr166 1.5 EndCondition.await();
147 dl 1.1 }
148     finally {
149     End.unlock();
150     }
151 jsr166 1.3 } catch (Exception ex) {
152 jsr166 1.5 System.out.println("Exception in End: " + ex);
153 dl 1.1 }
154     }
155     finally {
156     DeathRow.unlock();
157     }
158 jsr166 1.5 System.out.println("Outer time: " + (System.currentTimeMillis()-cyBase));
159 jsr166 1.3
160     // Let workers quiesce/exit.
161 jsr166 1.5 try { Thread.sleep (1000); } catch (Exception ex) {};
162 dl 1.1 }
163     }