• ベストアンサー

synchronizedが解りません。

synchronized( a ) { a.add(); } ブロック文で aオブジェクトをロックしてるはずなんですが 結果を見ると出来てないようです なぜうまくいかないんでしょうか? 教えてください。 class Test extends Thread { feet a = new feet(); public static void main( String args[] ){ for( int i = 0; i < 3; i++ ){ Test b = new Test(); b.start(); } } public void run() { synchronized( a ) { a.add(); } } } class feet{ int n, m; void add(){ n++; System.out.println( n + " " + m ); try { Thread.sleep( 1000 ); }catch( InterruptedException err ){ } m++; System.out.println( n + " " + m ); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • auty
  • ベストアンサー率58% (284/486)
回答No.1

異なるオブジェクトb1,b2,b3のインスタンスメソッドadd()を実行しているので、 実行されるメソッドadd()は、全て異なるのではないでしょうか。

startover
質問者

お礼

回答ありがとうございます! なるほど! 異なるインスタンスメソッドですか! 教えて頂きありがとうございます。

その他の回答 (1)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

ふつうは、次のように、同期化が必要なオブジェクト側でsynchronizedを使い、自分の資源を防備します。(全角スペースを半角スペースに変えてからコンパイルしてください。) --------------------------------------- class ThreadTest extends Thread {  static Feet a = new Feet(); //ただ一つのFeetオブジェクト  public static void main( String args[] ){   for (int i = 0; i < 3; i++){    ThreadTest b = new ThreadTest();    b.start();   }  }  public void run() {   a.add();  } } class Feet{  int n, m;  synchronized void add(){   n++;   System.out.println    (Thread.currentThread().getName() + ": " + n + " " + m);   try {    Thread.sleep(1000);   }   catch( InterruptedException err ){    err.printStackTrace();   }   m++;   System.out.println    (Thread.currentThread().getName() + ": " + n + " " + m);  } } -------------------------------

startover
質問者

お礼

回答ありがとうございます staticを使うんですね! コードで教えて頂きどうもです。

関連するQ&A