(一)準備
(二)阻塞和恢複
(1)wait方法


阻塞:這三個方法的調用都會使目前線程阻塞。該線程将會被放置到對該Object的請求等待隊列中,然後讓出目前對Object所擁有的所有的同步請求。線程會一直暫停所有線程排程,直到下面其中一種情況發生:
① 其他線程調用了該Object的notify方法,而該線程剛好是那個被喚醒的線程;
② 其他線程調用了該Object的notifyAll方法;
③ 其他對象中斷/殺死了該線程;
④ (這種情況,隻針對前兩個方法)線程在等待指定的時間後;
恢複:線程将會從等待隊列中移除,重新成為可排程線程。它會與其他線程以正常的方式競争對象同步請求。一旦它重新獲得對象的同步請求,所有之前的請求狀态都會恢複,也就是線程調用wait的地方的狀态。線程将會在之前調用wait的地方繼續運作下去。
(2)notify和notifyAll方法
notify的作用就是喚醒請求隊列中的一個線程,而notifyAll喚醒的是請求隊列中的所有線程。
被喚醒的線程不會馬上運作,除非擷取了該Object的鎖。也就是說,調用notify的線程,在調用notify後,不會像wait一樣,馬上阻塞線程的運作。而是繼續運作,直到相應的線程排程完成或者讓出Object的鎖。而被喚醒的線程會在目前線程讓出Object鎖後,與其他線程以正常的方式競争對象鎖(正如上面提到的)。
參考資料:
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html


本文轉自農夫山泉别墅部落格園部落格,原文連結:http://www.cnblogs.com/yaowen/p/6141807.html,如需轉載請自行聯系原作者