2009-11-15 51 views
0

我正在閱讀一本java 6書。示例代碼段來自主題章節,在這裏我需要澄清等待之後不應該處於阻塞狀態而不是可運行狀態?

synchronized(a){ //The thread gets the lock on 'a' 
a.wait(2000);// Thread releases the lock and waits for notify only for maximum of two seconds, then goes back to runnable state 
//The thread reacquires the lock 
//More instructions here 
} 

現在我的疑問是,2秒的等待時間之後,繼續進一步執行代碼下面給出,上面的代碼將要求對象的鎖'a',並且另一個線程(應該調用a)上的notify()可能已經在鎖定它了。

因此,不應該在等待2秒鐘之後線程進入阻塞狀態,而不是像上面在註釋中所述的運行狀態(在第2行中)。

回答

1

如果另一個線程鎖定了對象,那麼是的,你是對的,它會等待。等待的javadocs在經過指定的時間量時指示以下行爲。

「線程T然後從等待設置爲該對象中移除,併爲線程調度重新啓用,然後以通常的方式與其他線程競爭權限以在對象上進行同步;一旦獲得控制權對象的所有同步聲明都恢復到現狀 - 也就是等待方法被調用時的情況「

+0

在上述語句中,它表示」啓用線程調度「,這意味着它現在處於Runnable狀態。對? 但是,下一行指出現在它完成與其他線程權限同步(即獲得鎖) - 那麼這將意味着線程在 - 鎖定狀態的對象鎖 那麼哪一個是正確的?它處於可運行狀態還是處於阻塞狀態? 如果我在任何地方都錯了,請糾正我。 – Harish 2009-11-15 20:03:17

+0

如果沒有其他線程擁有鎖定,它將可以運行,但如果有其他鎖定,則必須像其他人一樣等待。你應該寫一些測試來進一步探索這種行爲。 – 2009-11-15 20:51:59

+0

感謝這個信息。我會按照建議嘗試一些例子 – Harish 2009-11-15 21:58:12