/* * Rácer.java * * 1.0 * * 000908 * * Leif Lindbäck. * */ /** * A runnable used to cause a race condition. */ public class Racer implements Runnable { private UpdateMe um; private final int NO_OF_UPDATES = 1000000; /** * Constructs a Racer that will update the specified UpdateMe object. */ public Racer( UpdateMe um ) { this.um = um; } /** * Updates um NO_OF_UPDATES times and print the result. */ public void run() { System.out.println( Thread.currentThread() + " starting"); for (int i = NO_OF_UPDATES; i>0; i--) { um.addToValue( 10 ); } for (int i = NO_OF_UPDATES; i>0; i--) { um.addToValue( -10 ); } System.out.println( Thread.currentThread() + " done"); } public static void main( String[] args ) throws InterruptedException { /* Create some threads that will update the same field. */ UpdateMe um = new UpdateMe(); Racer r = new Racer( um ); Thread theThreads[] = new Thread[5]; System.out.println( "before update, value = " + um.getValue() ); for(int i=0; i