2016-07-26 13 views
0

私はスレッドが初めてで、デッドロックの例を思いついた。 デッドロックシナリオを再現しようとしましたが、コードは問題なく正常に動作しました。スレッドのデッドロックjava

私はどこに間違っているのか教えてください。 は、以下のコード

package Practice; 

public class Deadlock { 

    public static void main(String[] args) { 

     Deadlock a = new Deadlock(); 
     Threadslock first = new Threadslock(a); 
     Threadslock second = new Threadslock(a); 
     first.setName("First"); 
     second.setName("Second"); 
     first.start(); 
     second.start(); 

    } 

} 

class Threadslock extends Thread 
{ 
    Deadlock lock ; 
    private String anotherLock = ""; 
    Threadslock(Deadlock lo) 
    { 
     lock = lo; 
    } 
    public void run() 
    { 

     if(getName().equals("First")) 
     { 
      synchronized(lock) 
      { 
       synchronized(anotherLock) 
       { 
        try 
        { 
        Thread.sleep (2000); 
        } 
        catch(InterruptedException r) 
        { 

        } 
       System.out.println("First Thread"); 
       System.out.println("Next Step in First"); 
       } 
      } 
     } 
     else 
     { 
      synchronized(anotherLock) 
      { 
       synchronized(lock) 
       { 
        try{ 
         Thread.sleep (2000);  
        } 
        catch(Exception e) 
        { 

        } 

       System.out.println("Second Thread"); 
       System.out.println("Next Step in Second"); 
       } 
      } 
     } 
    } 
} 
ある

出力は次のようなものです:

最初のスレッドまず

セカンドスレッドで
次のステップ両方のロックが必要セカンド

+2

デッドロックを取得する "トリック"は、ロックインターリーブであるため、両方の同期ブロック間ではなく、2つの同期ブロックの間でスリープする必要があります。 –

+0

大きな 'if'文を持つ' run() 'メソッドの代わりに、2つの異なる' Runnable'インスタンスで2つの異なるスレッドの振る舞いを実装した場合、あなたのコード(そしてあなたの習慣)それは実行する動作を決定します。 –

+0

@jameslarge動作を示唆してくれてありがとう。私は上記の場合でもデッドロックが可能かどうかを確認していただけです –

答えて

1

間睡眠を追加しました、あなたは間違った場所に睡眠を追加します。

さらに、2つのanotherLockインスタンスが両方のスレッドにあります。スレッド優先と2番目のスレッドがそれぞれanotherLockを取得できるため、デッドロックは発生しません。したがって、2つのスレッドが同じanotherLockを共有するようにする必要があります。

以下のコードを確認してください。役立つことを願います。

public class Deadlock { 

    public static void main(String[] args) { 

     Deadlock a = new Deadlock(); 
     String anotherLock = ""; 
     Threadslock first = new Threadslock(a,anotherLock); 
     Threadslock second = new Threadslock(a,anotherLock); 
     first.setName("First"); 
     second.setName("Second"); 
     first.start(); 
     second.start(); 

    } 

} 

class Threadslock extends Thread 
{ 
    Deadlock lock ; 
    String anotherLock; 
    Threadslock(Deadlock lo, String anotherLock) 
    { 
     lock = lo; 
     this.anotherLock = anotherLock; 
    } 
    public void run() 
    { 

     if(getName().equals("First")) 
     { 
      synchronized(lock) 
      { 
       System.out.println("First Thread"); 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       synchronized(anotherLock) 
       { 
        try 
        { 
        Thread.sleep (2000); 
        } 
        catch(InterruptedException r) 
        { 

        } 
       System.out.println("Next Step in First"); 
       } 
      } 
     } 
     else 
     { 
      synchronized(anotherLock) 
      { 
       System.out.println("Second Thread"); 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
       synchronized(lock) 
       { 
        try{ 
         Thread.sleep (2000);  
        } 
        catch(Exception e) 
        { 

        } 
       System.out.println("Next Step in Second"); 
       } 
      } 
     } 
    } 
} 
1


次のステップデッドロックを作成するために共有することができます。この

package Practice; 

public class Deadlock { 

    public static void main(String[] args) { 

     Deadlock l1 = new Deadlock(); 
     Deadlock l2 = new Deadlock(); 
     Threadslock first = new Threadslock("First", l1, l2); 
     Threadslock second = new Threadslock("Second", l2, l1); 
     first.start(); 
     second.start(); 

    } 

} 

class Threadslock extends Thread 
{ 
    Deadlock first; 
    Deadlock second; 
    String name; 

    Threadslock(String name, Deadlock first, Deadlock second) 
    { 
     this.name = name; 
     this.first = first; 
     this.second = second; 
    } 
    public void run() 
    { 

     synchronized(first) 
      { 
       try 
        { 
        Thread.sleep (2000); 
        } 
        catch(InterruptedException r) 
        { 

        } 
       synchronized(second) 
       { 

       System.out.println(name + " Thread"); 
       System.out.println("Next Step in " + name); 
       } 
      } 

    } 
} 

EDITしてみてください:@Sean明るいが示唆したように取得ロック

+0

こんにちは@pablochan、このコードでも同じ出力が得られます。私のコードでは、両方のロックが2つのスレッドで共有されていると思います。私が間違っている場合私を修正してください –

+0

私はコードを実行し、デッドロックがあります。コピーして貼り付けてください。 – pablochan

+0

@パブロchan。どちらのスレッドもanotherLockのインスタンスを持っています。 anotherLockはあなたのコードで共有されていません。 – Gearon

関連する問題