在 Java 發展史上曾經使用 suspend()、resume()方法對於線程進行阻塞喚醒,但
隨之出現很多問題,比較典型的還是死鎖問題。
解決方案可以使用以對象為目標的阻塞,即利用 Object 類的 wait()和 notify()方
法實現線程阻塞。
首先,wait、notify 方法是針對對象的,調用任意對象的 wait()方法都將導致線程
阻塞,阻塞的同時也將釋放該對象的鎖,相應地,調用任意對象的 notify()方法則
將隨機解除該對象阻塞的線程,但它需要重新獲取改對象的鎖,直到獲取成功才
能往下執行;其次,wait、notify 方法必須在 synchronized 塊或方法中被調用,
並且要保證同步塊或方法的鎖對象與調用 wait、notify 方法的對象是同一個,如
此一來在調用 wait 之前當前線程就已經成功獲取某對象的鎖,執行 wait 阻塞后當
前線程就將之前獲取的對象鎖釋放。