13

私の質問は、次のようなコードがあるかどうかです-:

public class OuterClass{
   public class InnerClass{
          public synchronized methodA(){ /* does something */}
   }
}

複数のスレッドが内部クラスのメソッドを呼び出したい場合、外部クラスのオブジェクトまたは内部クラスのオブジェクトのロックを取得し、外部クラスのオブジェクトへのアクセスを同期するようにステートメントをどのように変更しますか/

4

3 に答える 3

20

複数のスレッドが内部クラス メソッドを呼び出したい場合、それらは外部クラス オブジェクトのロックを取得しますか?

いいえ。

または内部クラス オブジェクトの場合

はい。

そして、外部クラスオブジェクトへのアクセスを同期するようにステートメントをどのように変更しますか/

追加:

synchronized (OuterClass.this)
{
}

ただし、構文が示すように、外側のロックの前に内側のロックが取得されることに注意してください。デッドロックを防ぐには、一貫したロック順序が不可欠です。最初に外側のロックを取得したい場合は、次のようにする必要があります。

public void methodA()
{
    synchronized(OuterClass.this)
    {
        synchronized (this)
        {
            // ...
        }
    }
}

synchronizedメソッド自体の宣言なし。または、外側のロックのみが必要な場合は、次のようにします。

public void methodA()
{
    synchronized(OuterClass.this)
    {
        // ...
    }
}
于 2013-09-20T07:08:33.133 に答える
4

すぐ外側のクラスのを使用するthisため、内部クラスになります。代わりに使用できます:

public void m() {
    synchronized(OuterClass.this) {
    }
 }
于 2013-09-20T07:09:49.797 に答える