////////////////////////////////////////////////////////////////////////////////
//  << j541d.java >>
//
//  スレッド(4):干渉の解決法実験(synchronizedメソッド)
//
//  加算スレッドをm個作成し、各スレッドの繰り返し回数をnとする。
//  最後の結果がmnになれば干渉を解決したことになる。
//
//  (1)計算クラスの定義。
//     addメソッドをsynchronizedメソッドに書き換える。
//  (2)加算クラスの定義。
//  (3)コマンドラインからスレッド数args[0]を取得。
//  (4)コマンドラインから繰り返し回数args[0]を取得。
//  (5)Compクラスのオブジェクトの作成。
//  (6)スレッドを格納する配列を準備。
//  (7)スレッドの作成。
//  (8)スレッドの実行。
//
////////////////////////////////////////////////////////////////////////////////

//(1)
class Comp {
  long count = 0;
  synchronized void add() { count++; }
}

//(2)
class Thread1 extends Thread {
  Comp c;
  long n;
  Thread1(Comp c, long n) { // コンストラクタ。 
    this.c = c; this.n = n;
  }
  public void run() {
    for( long i=1; i<=n; i++ ) { c.add(); }
    System.out.println("加算スレッド(" +  this.getName() + "):" + c.count);
  }
}

class j541d {
  public static void main(String args[]) {

    int m = Integer.parseInt(args[0]); //(3)
    System.out.println("スレッド数 = " + m);
    long n = Integer.parseInt(args[1]); //(4)
    System.out.println("繰り返し回数 = " + n);

    Comp c = new Comp(); //(5)

    Thread1 th[] = new Thread1[m]; //(6)
    for( int i=0; i<m; i++ ) {
      th[i] = new Thread1(c,n); //(7)
      th[i].start(); //(8)
    }

  }

}
実行結果
% javac j541d.java
% java j541d 9 1000000
スレッド数 = 9
繰り返し回数 = 1000000
加算スレッド(Thread-0):1000000
加算スレッド(Thread-1):2000000
加算スレッド(Thread-2):3000000
加算スレッド(Thread-3):4000000
加算スレッド(Thread-4):5000000
加算スレッド(Thread-5):6000000
加算スレッド(Thread-6):7000000
加算スレッド(Thread-7):8000000
加算スレッド(Thread-8):9000000

% java j541d 9 10000000
スレッド数 = 9
繰り返し回数 = 10000000
加算スレッド(Thread-0):72155131
加算スレッド(Thread-2):89998491
加算スレッド(Thread-7):89998927
加算スレッド(Thread-6):89999299
加算スレッド(Thread-3):89999411
加算スレッド(Thread-8):89999606
加算スレッド(Thread-5):89999734
加算スレッド(Thread-1):89999795
加算スレッド(Thread-4):90000000