////////////////////////////////////////////////////////////////////////////////
//  << j541c.java >>
//
//  スレッド(4):干渉の解決法2(synchronizedブロック)
//
//  synchronizedブロックを使って干渉を解決する。
//
//  (1)計算クラスの定義。
//  (2)加算クラスの定義。
//     synchroizedブロックを記述する。
//  (3)コマンドラインから繰り返し回数args[0]を取得。
//  (4)Compクラスのオブジェクトの作成。
//  (5)スレッドthaの作成。
//  (6)スレッドthbの作成。
//  (7)スレッドthaの実行。
//  (8)スレッドthbの実行。
//
////////////////////////////////////////////////////////////////////////////////

//(1)
class Comp {
  long count = 0;
  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++ ) { 
      synchronized(c) { c.add(); }
    }
    System.out.println("加算スレッド(" +  this.getName() + "):" + c.count);
  }
}

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

    long n = Long.parseLong(args[0]); //(3)
    System.out.println("繰り返し回数 = " + n);

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

    Thread1 tha = new Thread1(c,n); //(5)
    Thread1 thb = new Thread1(c,n); //(6)

    tha.start(); //(7)
    thb.start(); //(8)

  }

}
実行結果
% javac j541c.java
% java j541c 1000000
繰り返し回数 = 1000000
加算スレッド(Thread-0):1000000
加算スレッド(Thread-1):2000000

% java j541c 10000000
繰り返し回数 = 10000000
加算スレッド(Thread-0):17402773
加算スレッド(Thread-1):20000000

% java j541c 100000000
繰り返し回数 = 100000000
加算スレッド(Thread-0):195161233
加算スレッド(Thread-1):200000000