0

私たちが持っているとしましょう

class A {
    void m1() {
        synchronized (this) {
        }
        blah blah blah
        synchronized (this) {
        }
    }
}

私の疑問は、オブジェクト o を使用して現在実行中のスレッドがロックを解除しているときに、オブジェクト o を使用する他のスレッドがロックを取得すると、デッドロックが発生することです。では、同期メソッドの代わりに同期ブロックを使用しようとする必要があるとどのように言えますか?

スレッド t1 がクラス レベルのロックを取得する静的同期メソッドを実行するとします。他のスレッドは、このクラスのインスタンスのロックを取得して、他の同期メソッドを実行できますか?

4

2 に答える 2

2

はい。オブジェクトの同期はClass<?>、オブジェクトのクラスのオブジェクトの同期から完全に独立しています。

于 2013-10-07T16:53:30.670 に答える
2

「何とか何とか」を実行している間、現在実行中のスレッドはロックを所有していません。別のスレッドがオブジェクトのロックを取得することは可能ですが、デッドロックは発生しません。最初のスレッドは、他のスレッドがロックを解放するまで単純にブロックします。

スレッド A がロック 1 を所有しているが、ロック 2 が必要で、スレッド B がロック 2 を所有しているがロック 1 が必要な場合、デッドロックが発生します。これは、あなたの状況では発生していません。

クラス レベルのロックは、オブジェクト インスタンスのロックとは異なるロックです。したがって、クラス レベルのロックは、オブジェクトで他の同期メソッドを実行する別のスレッドに干渉しません。

于 2013-10-07T16:55:14.440 に答える