2012-04-11 7 views
1

はありがとうございこれらのJavaの状況
の1-がデッドロックしますか?

synchronized(obj) { 
    obj.syncMethod(); // the method signature: public synchronized void syncMethod() {...} 
} 

2 -

synchronized(obj) { 
    if (condition) 
    throw new Exception(); // deadlock because obj lock is not released? 
    // do other stuff 
} 

に起こるデッドロックします。

+0

同期メソッドの経験はありませんが、例外がスローされ、メソッドの実行が異常終了するだけでデッドロックが発生する可能性は愚かなようです。その場合、例外をキャッチしてオブジェクトのロックを解除し、新しい例外をスローすることができます。 – MarioDS

+0

コードをテストして調べてみませんか? –

答えて

1
  1. ないデッドロックが発生する - スレッドが(OBJで、あなたのケースで)ロックを保持している間に、Javaのロックはリエントラントある。つまり、それは問題なく同じロックを必要とする同期ブロックを入力することができます(同期方法で同期していますが、これもあなたの場合はobjです)。
  2. 例外がスレッドを離脱させるかどうかに関係なく、同期ブロックが残っているとロックが解除されます。
+0

なぜ、j.u.c.Locksを使用する場合は、try/finallyブロックでロック/ロック解除を実行することがベストプラクティスであり、常にロック解除が実行されることが保証されます。 Intrinsic syncronization(別名同期化)はデフォルトでこれを提供しますが、その他の制限があります –

2
  1. デッドロックは発生しません。あなたは既にロックをobjに持っています。

  2. 例外がスローされると、ロックが解除されます。あなたは、あなたのロックが解除され、デッドロックが発生しないことができ、あなたの​​ブロックで例外をキャッチしない場合

Side effects of throwing an exception inside a synchronized clause?

0

:ここではSOの質問を参照してください。詳細は、hereを参照してください。

関連する問題