2016-05-04 14 views
0

をロックしたsynchronizedキーワードの意味を適用しているが、第二のスレッドで印刷されます「ショー」という言葉は、私のコード我々はここでオブジェクト

class Thread1 extends Thread 
{ 
public synchronized void show() 
{ 
    System.out.println("show"); 
    System.out.println(Thread.currentThread().getName()); 
    try 
    { 
    Thread.sleep(5000); 
    } 
    catch(Exception e) 
    { 
    System.out.println(e); 
    } 
} 

public synchronized void display() 
{ 
    System.out.println("Display"); 
    System.out.println(Thread.currentThread().getName()); 
} 

public static void main(String args[]) 
{ 
    Thread1 z=new Thread1(); 
    z.set(); 
} 

public void set() 
{ 
    Thread1 tr=new Thread1(); 
    Thread1 tr1=new Thread1(); 
    tr.start(); 
    tr1.start(); 
} 

public void run() 
{ 
    try 
    { 
    show(); 
    display(); 
    } 

    catch(Exception e) 
    { 
    System.out.println(e); 
    } 
} 
} 

答えて

0

なぜ私はあなたがshowである理由について尋ねるためのものと仮定いずれかのスレッド名が印刷される前に両方のスレッドによって印刷されます。

インスタンスメソッドを同期しているため、メソッドが呼び出されたオブジェクトが暗黙的にロックされます。しかし、2つの異なったThread1オブジェクトが自分自身でロックしているので、どちらのスレッドも同期メソッドへの入力を停止していません。

Threadを1度に1つずつ​​のメソッドを実行する場合は、共通のオブジェクトをロックする必要があります。 Thread1.classにロックする​​ブロックを使用してください。

showメソッドの場合は次のようになります。

public void show() 
{ 
    synchronized (Thread1.class) 
    { 
     System.out.println("show"); 
     System.out.println(Thread.currentThread().getName()); 
     try 
     { 
      Thread.sleep(5000); 
     } 
     catch (Exception e) 
     { 
      System.out.println(e); 
     } 
    } 
} 

displayの方法も同様に変更することができます。

0

独自の状態(trとtr1)を持つ2つの異なるオブジェクトをインスタンス化しています。彼らは決して同じ同期ブロックにアクセスしないので、他のものが終了するのを待ってブロックすることはありません。

showメソッドを別のクラスに移動し、そのクラスをインスタンス化してから、trとtr1にコンストラクタパラメータとして渡します。

関連する問題