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();
  }  
} 

这两个同步是否等效?

4

3 回答 3

0

不,它们不相等。这个方法在这里:

public synchronized void some_m() {  
  ...  
}

与此相同:

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

或者换句话说

  1. A您的第一个代码选项在in Some_Class(类成员,每个人都可见)的实例上同步。
  2. B您的第二个代码选项在inside 的实例上同步Some_Class.method_A()(一个局部变量,对该方法的外部不可见)
于 2013-01-02T12:17:38.167 回答
0

不,它们不相等。在第二种情况下,您实际上根本没有同步。因为some_m方法在B. 因此,您创建 B 的本地实例并在其上调用方法。此方法仅在 B 的本地实例上同步,其他线程不关心它,并且可以做任何他们想做的事情,s因为它不同步。
你能描述一下你想要达到的目标吗?

于 2013-01-02T12:17:42.300 回答
0

同步块同步整个对象,而同步方法仅同步该方法。在第二种情况下,某些线程仍然可以访问对象的其他非同步方法。

于 2013-01-02T12:18:45.903 回答