Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • benchmark/schedint/JavaThread.java

    rbe53b87 rbf71cfd  
    11class Monitor {
    22        public static volatile Boolean go = false;
    3         public static volatile Boolean next = false;
    43}
    54
     
    1413                while( Monitor.go ) {
    1514                        synchronized(this.m) {
    16                                 Monitor.next = false;
    1715                                this.m.notify();
    1816                        }
    19                         while( ! Monitor.next && Monitor.go );  // spin until woken
    2017                }
    2118        }
     
    2320
    2421public 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 final int NoOfTimes = Integer.parseInt("1000000") ;
    52 
    53         public static void helper( Monitor m ) throws InterruptedException {
    54                 for(int i = 1; i <= NoOfTimes; i += 1) {
    55                         m.wait();               // relase monitor lock
    56                         m.next = true;
    57                 }
    58         }
    59         public static void InnerMain() throws InterruptedException {
     22        public static void main(String[] args) throws InterruptedException {
     23                int NoOfTimes = 50000;
    6024                Monitor m = new Monitor();
    6125                long start, end;
     
    6731                        }
    6832                        start = System.nanoTime();
    69                         helper( m );
     33                        for(int i = 1; i <= NoOfTimes; i += 1) {
     34                                m.wait();
     35                        }
    7036                        end = System.nanoTime();
    7137                }
     
    7440                System.out.println( (end - start) / NoOfTimes);
    7541        }
    76         public static void main(String[] args) throws InterruptedException {
    77                 for (int n = Integer.parseInt("5"); --n >= 0 ; ) {
    78                         InnerMain();
    79                         Thread.sleep(2000);     // 2 seconds
    80                         x = nextRandom(x);
    81                 }
    82                 if ( x == 0 ) System.out.println(x);
    83         }
    8442}
Note: See TracChangeset for help on using the changeset viewer.