このようなものがあるとしましょう。
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呼び出すm2m2JVMに入る前に、 のモニターをロックし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()