このようなものがあるとしましょう。
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
私の質問 - オブジェクト obj のロックはいつ解除されますか? メソッド m2 またはメソッド m1 から戻るときは?
このようなものがあるとしましょう。
class Class{
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}
私の質問 - オブジェクト obj のロックはいつ解除されますか? メソッド m2 またはメソッド m1 から戻るときは?
スレッド t は、特定のモニターを複数回ロックする場合があります。ロックを解除するたびに、1 回のロック操作の効果が逆になります。
ただし、異なるオブジェクト をロックする可能性があるという事実により、質問は複雑になりm1()
ます。表示していない、呼び出したオブジェクトをロックします。したがって、一連のイベントは次のとおりです。m2()
m1()
x.m1(y)
wherex
とを呼び出すと、y
の異なるインスタンスになる可能性がありますClass
。m1
、JVM は のモニターをロックしx
ます。m1
呼び出すm2
m2
JVMに入る前に、 のモニターをロックしy
ます。m2
と、モニターy
が解放されますm1
と、モニターx
が解放されますx
とy
が同じオブジェクトの場合、終了時にロックが解除されますm1
。
synchronized
同期ブロック内のメソッドを翻訳してみてください:
m1(C obj) {
synchronized(this) {
obj.m2();
}
}
m2() {
synchronized(this) {
// some stuff
}
}
したがって、obj
オブジェクトはm2()
呼び出し中にのみロックされます。this
これは、 が に変換されるのはそのときだけだからobj
です。
このm1()
呼び出しは、現在のオブジェクトをロックするだけobj
です。これが当てはまる場合 (this == obj
最初の呼び出しで)、両方と完了obj
するまでロックされます。m1()
m2()