synchronized方法而不是java中的synchronized语句

时间:2013-01-02 12:13:00

标签: java synchronization

我有一个在“非本”对象上使用同步语句的方法

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

这两个同步是否相同?

3 个答案:

答案 0 :(得分:0)

不,他们不等同。这个方法在这里:

public synchronized void some_m() {  
  ...  
}

与此相同:

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

或换句话说

  1. 您的第一个代码选项在A中的Some_Class实例上同步(一个类成员,对所有人都可见)。
  2. 您的第二个代码选项在B内的Some_Class.method_A()实例上同步(一个局部变量,该方法外部不可见)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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