2012-10-20 97 views
3

如果一个同步方法调用wait()的另一个同步方法(在另一个类中)会怎么样。锁定是否会以第一种同步方法释放,虽然在另一个类中?同步方法调用另一个调用wait()的同步方法

E.g.

public class A { 
     private B b; 

     public A(B b) { 
      this.b = b; 
     } 

     public synchronized String a() { 
      return b.b(); 
     } 
    } 

    public class B { 

     public synchronized String b() { 
      while (!someCondition) wait(); 
      return "Success!"; 
     } 
    } 

所以我的问题是,才有可能在时间someCondition期间,进入一个不同的同步方法=假?或者wait()是否可以在B中输入其他同步方法,而尝试在A中输入另一个同步方法将会失败,直到()返回?

+0

没有,只会释放'B',请参阅:http://tutorials.jenkov.com /java-concurrency/nested-monitor-lockout.html –

回答

0

号虽然调用a并随后b,没有其他的方法可以输入既不ab(或类AB任何其他同步法)。然而b.wait()发布以来

public synchronized String b() 

B所有同步方法锁基本上等同于

public String b() { 
    synchronized(this) { 
    .. 
    } 
} 
+0

但是,b中的wait() - 调用会释放B类中的锁,对吧?因此,如果我们在B中有另一种方法,例如公共同步c(),当wait()完成时,可以输入c。对? – Martin

+0

是的,这是正确的 –

+0

但是,然后它甚至不可能从方法b()中释放A中的锁,因为()被锁定在“this”上? – Martin

相关问题