私はスレッドが初めてで、デッドロックの例を思いついた。 デッドロックシナリオを再現しようとしましたが、コードは問題なく正常に動作しました。スレッドのデッドロック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つの同期ブロックの間でスリープする必要があります。 –
大きな 'if'文を持つ' run() 'メソッドの代わりに、2つの異なる' Runnable'インスタンスで2つの異なるスレッドの振る舞いを実装した場合、あなたのコード(そしてあなたの習慣)それは実行する動作を決定します。 –
@jameslarge動作を示唆してくれてありがとう。私は上記の場合でもデッドロックが可能かどうかを確認していただけです –