1. 程式人生 > >Java wait,notify, notifyAll, suspend,resume

Java wait,notify, notifyAll, suspend,resume

一個執行緒呼叫了object.wait() ,那麼會進入object的等待佇列。

這個佇列可能有很多執行緒同時等待某個物件。

當notify被呼叫的時候,它會從這個佇列中隨機選一個執行緒,喚醒它,這個完全是隨機的。

notifyAll()是喚醒所有等待的。

wait,notify,notifyall方法使用的條件,必須再synchronzied語句中,因為需要獲得目標物件的一個監視器。

為什麼這三個方法要與synchronized一起使用呢?解釋這個問題之前,我們先要了解幾個知識點

每一個物件都有一個與之對應的監視器
每一個監視器裡面都有一個該物件的鎖和一個等待佇列和一個同步佇列
wait()方法的語義有兩個,一是釋放當前物件鎖,另一個是進入阻塞佇列,可以看到,這些操作都是與監視器相關的,當然要指定一個監視器才能完成這個操作了

notify()方法也是一樣的,用來喚醒一個執行緒,你要去喚醒,首先你得知道他在哪兒,所以必須先找到該物件,也就是獲取該物件的鎖,當獲取到該物件的鎖之後,才能去該物件的對應的等待佇列去喚醒一個執行緒。值得注意的是,只有當執行喚醒工作的執行緒離開同步塊,即釋放鎖之後,被喚醒執行緒才能去競爭鎖。

notifyAll()方法和notify()一樣,只不過是喚醒等待佇列中的所有執行緒

因wait()而導致阻塞的執行緒是放在阻塞佇列中的,因競爭失敗導致的阻塞是放在同步佇列中的,notify()/notifyAll()實質上是把阻塞佇列中的執行緒放到同步佇列中去

為了便於理解,你可以把執行緒想象成一個個列車,物件想象成車站,每一個車站每一次能跑一班車,這樣理解起來就比較容易了。

suspend,resume被廢棄,請勿使用

 

參考文章:

https://blog.csdn.net/qq_39907763/article/details/79301813?utm_source=blogxgwz9