2013-04-26 57 views
1

我最近看到下面一個例子。我無法理解主線程和乘客線程如何一次保留在同步塊中?同步方法 - 這是如何工作的?

public class bus 
{ 
    public static void main(String[] args) throws InterruptedException 
    { 
     passenger p = new passenger(); 
     p.start(); 
     synchronized (p) 
     { 
      System.out.println("passenger is waiting for the bus, i am in synchronised method"); 
      p.wait(); 
      System.out.println("passenger got notification"); 
     } 
     System.out.println("after "+p.total+" time"); 
    } 
} 

class passenger extends Thread 
{ 
    int total = 0; 

    public void run() 
    { 
     synchronized (this) 
     { 
      System.out.println("wait .... i am in synchronised method"); 
      for (int i = 0; i <= 1000; i++) 
      total = total + i; 
      System.out.println("passenger is given notification call"); 
      notify(); 
     } 
    } 
} 

該程序的輸出是

passenger is waiting for the bus i am in synchronised method 
wait .... i am in synchronised method 
passenger is given notification call 
passenger got notification 
after 500500 time 

,這意味着,主線程打印時「乘客等待我在同步方法中的總線」它已經在同步塊和等待。接下來的陳述是「等待......我處於同步方法」,這意味着乘客線程也進入其同步塊。請記住,兩個同步塊都具有與塊對象相同的對象 - p。這似乎令人困惑,因爲我知道,當主線程進入synchronized(p)塊,主線程必須阻擋的對象p和清晰度沒有其他線程可以訪問或輸入對象p的任何synchronized塊或方法!

+0

什麼部分你不明白嗎?這樣我們就會攻擊這個問題,而不是解釋整個程序。 – 2013-04-26 19:48:22

回答

4

主要和乘客線程如何能夠保持在一個synchronized塊一次?

p.wait()發佈p鎖,直到線程重新喚醒,所以任意數量的線程可以​​上p只要至多一個不候。

Object's javadoc

public final void wait() throws InterruptedException 

當前線程必須擁有該對象的監視器。 這款顯示器並等待另一個線程的線程釋放所有權通知線程在等待這個對象監視器或者通過對notify方法或notifyAll方法調用醒來。該線程然後等待,直到它可以重新獲得監視器的所有權並恢復執行。

+0

謝謝邁克。我現在明白了。 – Mohitt 2013-04-26 20:11:24

+0

@Mohitt,yw。快樂的等待。 – 2013-04-26 20:17:24