我最近看到下面一個例子。我無法理解主線程和乘客線程如何一次保留在同步塊中?同步方法 - 這是如何工作的?
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塊或方法!
什麼部分你不明白嗎?這樣我們就會攻擊這個問題,而不是解釋整個程序。 – 2013-04-26 19:48:22