1

このようなものがあるとしましょう。

class Class{    
//...
synchronized void m1(Class obj){ obj.m2(); }
synchronized void m2(){ /*...*/ }
}

私の質問 - オブジェクト obj のロックはいつ解除されますか? メソッド m2 またはメソッド m1 から戻るときは?

4

2 に答える 2

3

JLSセクション17から

スレッド t は、特定のモニターを複数回ロックする場合があります。ロックを解除するたびに、1 回のロック操作の効果が逆になります。

ただし、異なるオブジェクト をロックする可能性があるという事実により、質問は複雑になりm1()ます。表示していない、呼び出したオブジェクトをロックします。したがって、一連のイベントは次のとおりです。m2()m1()

  1. x.m1(y)wherexとを呼び出すと、yの異なるインスタンスになる可能性がありますClass
  2. に入る前にm1、JVM は のモニターをロックしxます。
  3. m1呼び出すm2
  4. m2JVMに入る前に、 のモニターをロックしyます。
  5. 終了するm2と、モニターyが解放されます
  6. 終了するm1と、モニターxが解放されます

xyが同じオブジェクトの場合、終了時にロックが解除されますm1

于 2012-05-30T22:55:22.243 に答える
1

synchronized同期ブロック内のメソッドを翻訳してみてください:

m1(C obj) {
    synchronized(this) {
        obj.m2();
    }
}

m2() {
    synchronized(this) {
        // some stuff
    }
}

したがって、objオブジェクトはm2()呼び出し中にのみロックされます。thisこれは、 が に変換されるのはそのときだけだからobjです。

このm1()呼び出しは、現在のオブジェクトをロックするだけobjです。これが当てはまる場合 (this == obj最初の呼び出しで)、両方と完了objするまでロックされます。m1()m2()

于 2012-05-30T23:03:50.567 に答える