これは、Joshua Blochによって書かれた本から取られています。スレッドがすでに保持しているロックを取得しようとするとどうなりますか?
私はネイティブの英語のスピーカーではないため、疑念の明確化を求める理由があります。スレッドが既に保持しているロックを取得するために をしようとすると、本来のロックは、再入可能であるため、
、要求 は成功します。リエントラントとは、**呼び出し単位ではなくスレッドごとに でロックが取得されることを意味します。
呼び出しごとに、メソッドごとにコールすることを意味しますか? スニペットを検討:
class Factoriser{
public synchronized void doSomething(){
// code goes here
}
}
がスレッドAであり、インスタンスメソッドのdoSomething()を持つオブジェクトのロックを取得することができると仮定する。何らかの理由で同じスレッドのスレッドAが再び同じオブジェクトインスタンスメソッドdoSomething()のロックを取得します(以前のロックがまだ解放されていないことも想像してください)。
Joshuaのステートメントを正しく理解すると、2つのメソッド呼び出し/呼び出しがあっても、ロックは1つだけになります。私の理解は100%正しいですか?例を挙げてください。私は混乱しています。なぜなら、著者は以下の段落でこれを明らかにしています。
リエントラントは、各ロックと取得カウントと所有スレッドを関連付けることによって実装されます。カウントがゼロの場合、ロックは保持されていないとみなされます。スレッドが以前に保持されていないロックを取得すると、JVMは所有者 を記録し、取得カウントを1に設定します。同じスレッド が再びロックを取得した場合、カウントは増分され、所有スレッドが同期ブロックを終了するときに になると、 のカウントがデクリメントされます。カウントがゼロになると、ロックが解除されます。
Reentrancy/locksの取得が呼び出し単位でない場合、私が上記のシナリオでJVMによって行われたカウントが2に設定されているのはなぜですか?
** **太字**の**ロット**です。 ** ** ** ** ** ** ** ** ** ** ** ** **実は、**大胆に** **無意味**と**気を散らす**となっています。 – Andreas
オブジェクトごとに1つのロックしかありません。任意の数の呼び出しは、同じロックを必要とするだけです(正常に)。最後のロックが解除されると、オブジェクトはロックされなくなります。なぜこれは難しいのですか? – markspace
@アンドレアス:ありがとう。削除されました。 –