0

「これ以外」のオブジェクトに同期ステートメントを含むメソッドがあります

class Some_Class { 
  public A s = new A();
  public void method_A() { 
    synchronized(s) { 
      ....
    } 
  }
}

代わりにクラス A を拡張して、次のように同期できますか。

class B extends A {  
  public A a;
  public B(A a) {  
    this.a = a; 
  }  
  public synchronized void some_m() {  
    ...  
  }  
}   
class Some_Class {  
  public A s = new A();
  public void method_A() {
    B b = new B(s);
    b.some_m();
  }  
} 

これら 2 つの同期は同等ですか?

4

3 に答える 3

0

いいえ、それらは同等ではありません。このメソッドは次のとおりです。

public synchronized void some_m() {  
  ...  
}

これと同じことをします:

public void some_m() {  
    synchronized(this) {
        ...  
    }
}  

または言い換えれば

  1. 最初のコード オプションは、AinのインスタンスSome_Class(すべてのユーザーに表示されるクラス メンバー) で同期します。
  2. 2番目のコードオプションは、B内のインスタンスで同期しますSome_Class.method_A()(そのメソッドの外部からは見えないローカル変数)
于 2013-01-02T12:17:38.167 に答える
0

いいえ、それらは同等ではありません。2番目のケースでは、実際には同期がまったくありません。some_mのインスタンスでメソッドが同期されたためですB。したがって、B のローカル インスタンスを作成し、その上でメソッドを呼び出します。このメソッドは B のこのローカル インスタンスでのみ同期され、他のスレッドはそれを気にせず、s同期されていないため、好きなことを行うことができます。
あなたが達成したいことを説明できますか?

于 2013-01-02T12:17:42.300 に答える
0

同期ブロックはオブジェクト全体を同期し、同期メソッドはそのメソッドだけを同期します。2 番目のケースでは、一部のスレッドはオブジェクトの他の非同期メソッドに引き続きアクセスできます。

于 2013-01-02T12:18:45.903 に答える