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