2017-02-26 9 views
3

私は自分自身でデッドロックを実装しようとしていました。スレッドt1とt2はs1とs2を同じ順序でロックしています。しかし、Line1とLine2はsleepメソッドデッドロックは発生しません。このプログラムは15回以上実行されましたが、行1と行2を削除してもデッドロックは発生しません。私のJavaのデッドロックの例を理解する

私のクエリは、デッドロックにはライン1とライン2(Thread.sleepを呼び出す)が必要です。はい、デッドロックを理解していません。いいえ、他のJVMでデッドロックが発生しますか?

//Thread DeadLock 

class Threadlock 
{ 
private final static String s1="java"; 
private final static String s2="deadlock"; 
public static void main(String[] args) 
{ 
    Thread t1= new Thread() 
    { 
    public void run() 
    { 
     synchronized(s1) 
     { 
     try { Thread.sleep(100);} 
     catch (Exception e) {} //Line 1 
     synchronized(s2) 
     {} 
     } 
    } 
    }; 

    Thread t2= new Thread() 
    { 
    public void run() 
    { 
     synchronized(s2) 
     { 
     try { Thread.sleep(100);} catch (Exception e) {} //Line 2 
     synchronized(s1) 
     {} 
     } 
    } 
    }; 

    t2.start(); 
    t1.start(); 
    } 
} 
+1

一部のスレッドで同じロックが同時に必要な場合にデッドロックが発生することがあります。あなたのケースでは、答えが言うように、同期化されたブロックは何もしません。 http://tutorials.jenkov.com/java-concurrency/deadlock.htmlを読んで、メカニズムをより良く理解するのに役立ちます。 –

+0

1行目と2行目についてコメントをお持ちの場合は、他のプログラムの助けを借りてプログラムを継続的に実行してください。デッドロックが理解できます。 –

+0

ワンノート:あなたが他の人にあなたの時間を過ごさせてもらうことを望みます。だから、あなたは常にあなたの入力をすべて正しくフォーマット/インディットするのにかかる1分を費やしてください。しかし、まだupvoted ... – GhostCat

答えて

6

睡眠を取り除くと、あなたのメソッドは何もしません。したがって、それらは非常に速く、2つのスレッドが同時に最初の同期ブロックに入る確率は非常に低いです。しかし、それでも起こることがあります。

0

並行プログラムは、本質的に非決定論的です。実際には、障害のあるプログラムを実行すると、潜在的なデッドロックが観察される場合とされない場合があります。あなたが提示したコードは、Thread.sleepを呼び出しているかどうかにかかわらず不正な形式です。あなたのケースでは、眠ればデッドロックがより明白になるようですが、しばらく待つかどうかはそこにあります。

1

重要な点は、基本的な実装についてあまりコントロールしていないことです。意味:2つのスレッドを作成し、それらを「順番に」開始します。実際にはJVM/OSが...開始することが非常にうまくいく可能性があります。実行します。その後、t2を開始する。

デッドロックが発生する可能性を高めるため、あなたのメソッドを少なくとも数秒間は続けるようにしてください!

つまり、「デッドロックになる」は、メソッドの実際のランタイムに依存する関数ですおよび基本となる実装の詳細。

+2

Upps。正しい。最初のものがクリティカルセクションに入ってそこにとどまると、デッドロックではありません。もう一つはそこには行きません。まあ、デッドロックのいくつかの他の種類。とにかく;私はその部分を削除しました。あなたのご意見ありがとうございます! – GhostCat