2017-08-19 20 views
2
public class UThread implements Runnable { 
    @Override 
    public void run() { 
     synchronized (this) { 
      System.out.println("this is first"); 
      synchronized (this) { 
       System.out.println("this is second"); 
      } 
     } 

    } 
} 


public class main { 
    public static void main(String str[]) { 
     UThread uThread = new UThread(); 
     Thread t = new Thread(uThread); 
     t.start(); 
    } 
} 

がないなぜそれが印刷されていますデッドロック

this is first 
this is second 

をデッドロックがないのはなぜ?コードがすでに自身で占有されているthisをロックしようとした場合。

+5

それは単独で撮影されているためです。他のスレッドがそれを望む場合にのみブロックします。 –

答えて

1

これは仕様です。 Javaのmonitorenter命令は、​​キーワードの後に​​開きブレースに配置され、オブジェクトが現在のスレッドによってすでにブロックされているかどうかを意図的にチェックし、そうであればブロックのカウンタをインクリメントし、 ​​ステートメントの閉じるブレースはmonitorexit命令を示し、ブロッキングカウンタをデクリメントし、ゼロになるとモニタを解放し、他のスレッドが​​ステートメントを入力できるようにします。

1

デッドロックは、2つ以上のスレッドがクリティカルセクションを完了するために他のリソースが必要な場合に発生するため、スレッドは決して来ないリソースを無期限に待機します。あなたのケースでは

  • クリティカルセクション
  • に入る唯一のスレッドが待っている2つの以上のスレッドが存在しない場合

クリティカルセクションで唯一のリソースがありますがありますお互いに重要なリソース、デッドロックが発生することはありません。

関連する問題