- ベストアンサー
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 ); } }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
異なるオブジェクトb1,b2,b3のインスタンスメソッドadd()を実行しているので、 実行されるメソッドadd()は、全て異なるのではないでしょうか。
その他の回答 (1)
- _ranco_
- ベストアンサー率58% (126/214)
ふつうは、次のように、同期化が必要なオブジェクト側で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); } } -------------------------------
お礼
回答ありがとうございます staticを使うんですね! コードで教えて頂きどうもです。
お礼
回答ありがとうございます! なるほど! 異なるインスタンスメソッドですか! 教えて頂きありがとうございます。