2017-10-26 4 views
-1

Javaで同期テストを行っています。出力は私が期待したものではありません。同期メソッドのロックが機能していないようです。問題の考え方は?あなたはその論理に間違いを見ますか?同期メソッドの問題

class Sum implements Runnable{ 
    Thread th; 
    int start; 
    int end; 
    Sum(int start, int end){ 
      th = new Thread(this); 
      this.start = start; 
      this.end = end; 
      th.start(); 
    } 
    synchronized void count(){ 
      System.out.println("Starting " + this.start); 
      System.out.println("Ending " + this.end); 
    } 
    public void run(){ 
      count(); 
    } 
    public static void main(String[] args){ 
      Sum th1 = new Sum(1, 100); 
      Sum th2 = new Sum(101, 200); 
    } 
} 
+0

あなたは何を見ますか、何を期待していますか? –

+0

私は、最初のスレッドが印刷によって入り込んだら干渉なくrun()を完了することを期待しています:Starting ... Ending ...そして2番目のスレッドと同じです。私は出力を開始します...開始...終了...終了... –

答えて

1

あなたの問題は、あなたが​​キーワードがあなたのSumオブジェクトのすべてのインスタンスをロックするために使用することができることを想定しているということです。​​キーワードは、単一オブジェクト上でのみ同期します。 (あなたが2つの異なる協議ハッシュマップを持っていて、もう一方に挿入しているために挿入できなかった - それはあまり意味がないだろうと想像してください)。

countのメソッドをすべてのSumオブジェクトに確実に同期させるには、アプローチが異なる必要があります。