2012-10-20 93 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

相關問題