source: benchmark/schedint/JavaThread.java@ 6136ecc

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 6136ecc was 26fd986, checked in by Peter A. Buhr <pabuhr@…>, 6 years ago

update benchmarks for concurrency paper

  • Property mode set to 100644
File size: 2.4 KB
Line 
1class Monitor {
2 public static volatile Boolean go = false;
3 public static volatile Boolean next = false;
4}
5
6class Signaller extends Thread {
7 Monitor m;
8 Signaller(Monitor m) {
9 this.m = m;
10 }
11
12 public void run() {
13 Monitor.go = true;
14 while( Monitor.go ) {
15 synchronized(this.m) {
16 Monitor.next = false;
17 this.m.notify();
18 }
19 while( ! Monitor.next && Monitor.go ); // spin until woken
20 }
21 }
22}
23
24public class JavaThread {
25 // Simplistic low-quality Marsaglia Shift-XOR pseudo-random number generator.
26 // Bijective
27 // Cycle length for non-zero values is 4G-1.
28 // 0 is absorbing and should be avoided -- fixed point.
29 // The returned value is typically masked to produce a positive value.
30 static volatile int Ticket = 0 ;
31
32 private static int nextRandom (int x) {
33 if (x == 0) {
34 // reseed the PRNG
35 // Ticket is accessed infrequently and does not constitute a coherence hot-spot.
36 // Note that we use a non-atomic racy increment -- the race is rare and benign.
37 // If the race is a concern switch to an AtomicInteger.
38 // In addition accesses to the RW volatile global "Ticket" variable are not
39 // (readily) predictable at compile-time so the JIT will not be able to elide
40 // nextRandom() invocations.
41 x = ++Ticket ;
42 if (x == 0) x = 1 ;
43 }
44 x ^= x << 6;
45 x ^= x >>> 21;
46 x ^= x << 7;
47 return x ;
48 }
49 static int x = 2;
50
51 static private int times = Integer.parseInt("1000000");
52
53 public static void helper( Monitor m ) throws InterruptedException {
54 for(int i = 1; i <= times; i += 1) {
55 m.wait(); // relase monitor lock
56 m.next = true;
57 }
58 }
59 public static void InnerMain() throws InterruptedException {
60 Monitor m = new Monitor();
61 long start, end;
62 Signaller s = new Signaller(m);
63 synchronized(m) {
64 s.start();
65 while( ! Monitor.go ) { // waiter must start first
66 Thread.yield();
67 }
68 start = System.nanoTime();
69 helper( m );
70 end = System.nanoTime();
71 }
72 Monitor.go = false;
73 s.join();
74 System.out.println( (end - start) / times);
75 }
76 public static void main(String[] args) throws InterruptedException {
77 if ( args.length > 2 ) System.exit( 1 );
78 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
79
80 for (int n = Integer.parseInt("5"); --n >= 0 ; ) {
81 InnerMain();
82 Thread.sleep(2000); // 2 seconds
83 x = nextRandom(x);
84 }
85 if ( x == 0 ) System.out.println(x);
86 }
87}
88
89// Local Variables: //
90// tab-width: 4 //
91// End: //
Note: See TracBrowser for help on using the repository browser.