1

サブクラスまたは呼び出し元関数でクリティカルセクションが拡張された場合、どのように呼び出されますか?

同期されclass Aたメソッドがm1あり、m2

class A {
 public synchronized void m1() {}
 public synchronized void m2() {}
}

ととの両方を使用する方法class B extends Aもあり、同期も行われますm3m1m2

class B extends A {
 public synchronized void m3() { 
      ...
      m1();
      ...
      m2();
      ...
 }
}

m3と の呼び出し間で状態を変更しない場合は、これが必要になる場合がm1ありm2ます。

用語についての質問です。

それはなんと呼ばれていますか?

4

2 に答える 2

1

実行の流れにロック階層がある場合、階層からのロックはネストされたロックと呼ばれます。それらは、再入可能または再入不可にすることができます。

個々の操作がスレッドセーフである場合、この場合はm1()m2()ですが、制御フローが前の操作の結果に依存する一連の操作はデータ競合の対象になる可能性があります。これは条件付きスレッド セーフと呼ばれます。

于 2013-01-30T06:15:13.523 に答える
0

確かに、この状況を表す特別な用語はありません。さらに、サブクラスのクリティカル セクションを実際に拡張している場所がわかりません。

これは単に「サブクラスの新しいメソッド内でスーパークラスのメソッドを呼び出す」と呼ばれていると思います。他には何もありません。同期についてではありません。

更新:

実際、あなたがしたことは、そのようなコードです:

class B extends A {
 public void m3() { 
      synchronized (this) {
      ...
      synchronized (this) {
          //m1();
          ... m1 source...
      } 
      ...
      synchronized (this) {
          //m2();
          ... m2 source...
      } 
      ...
      }
 }
}

以下と完全に同等のもの:

class B extends A {
 public void m3() { 
      synchronized (this) {
      ...
          //m1();
          ... m1 source...
      ...
          //m2();
          ... m2 source...
      ...
      }
 }
}

つまり、同じオブジェクトのブロック内の同じオブジェクトの内部同期は、synchronized不要で無意味なことです。

于 2013-01-29T11:14:54.127 に答える