public class SynchronizedMethod {
   
/**
     * Print 10 numbers without synchronization. Sleep randomly
     * between calls to println.
     */
   
private static class AdderSync implements Runnable {
       
private int n = 0;

       
public synchronized void run() {
           
for(int i = 0; i < 1000; i++) {
               
n++;
           
}
        }
       
public synchronized int getN() {
           
return n;
       
}
    }
   
   
/**
     * Print 10 numbers *with* synchronization. Sleep randomly between
     * calls to println.
     */
   
private static class AdderNoSync implements Runnable {
       
private int n = 0;

       
public void run() {
           
for(int i = 0; i < 1000; i++) {
               
n++;
           
}
        }
       
public int getN() {
           
return n;
       
}
    }

   
public static void main(String[] args) {
       
Thread t1, t2, t3, t4;

       
// Run 4 threads with AdderSync
       
System.out.println("* AdderSync");
        AdderSync adder1 =
new AdderSync();
        t1 =
new Thread(adder1);
        t2 =
new Thread(adder1);
        t3 =
new Thread(adder1);
        t4 =
new Thread(adder1);
        t1.start
();
        t2.start
();
        t3.start
();
        t4.start
();
       
try {
           
t1.join();
            t2.join
();
            t3.join
();
            t4.join
();
       
} catch(InterruptedException e) {
           
System.err.println("Thread Interrupted");
       
}
       
System.out.println("n = " + adder1.getN());

       
// Run 4 thrads with AdderNoSync
       
System.out.println("* AdderNoSync");
        AdderNoSync adder2 =
new AdderNoSync();
        t1 =
new Thread(adder2);
        t2 =
new Thread(adder2);
        t3 =
new Thread(adder2);
        t4 =
new Thread(adder2);
        t1.start
();
        t2.start
();
        t3.start
();
        t4.start
();
       
try {
           
t1.join();
            t2.join
();
            t3.join
();
            t4.join
();
       
} catch(InterruptedException e) {
           
System.err.println("Thread Interrupted");
       
}
       
System.out.println("n = " + adder2.getN());
   
}
}