0

私は外部クラス A を持っていて、それには public 内部クラスがあります。構造は次のとおりです -:

public class A{

      public int x;

      public class B{
        private static final int y;
      }

      public synchronized int method1(){
             return x+ B.y;
      }
}

問題は、クラス A のすべてのメソッドで synchronized キーワードを使用した場合、内部クラスのメンバーもロックされるかどうかです。

4

3 に答える 3

1

クラス A のすべてのメソッドで synchronized キーワードを使用した場合、内部クラスのメンバーもロックされますか?

いいえ、そうではありません。

あなたはここで多くの点で混乱しているようです。

  • プリミティブ ミューテックスを (たとえばsynchronizedメソッド経由で)使用すると、同じミューテックスで同期している他のスレッドに対してのみロックされます。

  • this同期インスタンス メソッドを呼び出す場合、取得するミューテックスは対象オブジェクトのミューテックスです。

  • staticあなたの例では、インスタンス フィールドではなく、フィールドをロックしたいようです。


あなたがやろうとしていることを正しく理解しているなら、それを行う正しい方法は次のようなものです:

 public synchronized int method1(){
     synchronized (B.class) {
         return x + B.y;
     }
 }

これには2 つのミューテックスの取得が含まれるため、コードが常に同じ順序でそれらを取得するようにする必要があることに注意してください。(そうしないと、デッドロックのリスクがあります。)

Bフィールドの値を取得するために同期された静的メソッドを作成して呼び出すと、同じ効果が得られyます。

于 2013-09-14T04:47:59.483 に答える
0

いいえ、内部クラスと外部クラスは 2 つの異なるクラス オブジェクトであり、同じではありません。外部クラスにフィールドを作成して、手動で同期することをお勧めします。

于 2013-09-14T04:30:43.177 に答える
0

2 つのオブジェクトに単一のミューテックスを使用する例。どちらのオブジェクトも変数 x を変更できます。

公開クラスA {

      プライベート オブジェクト ミューテックス = new Object();
      プライベート int x;
      プライベート B b = 新しい B();

      公開クラス B {
        プライベート int y;

        public int メソッド() {        
           同期 (ミューテックス) {
              x++ を返します。
          }

        }
      }

      public int メソッド() {

          同期 (ミューテックス) {
             x += by; を返します。
         }
      }
}
于 2013-09-14T05:25:13.403 に答える