等待喚醒機制概述

什麼是等待喚醒機制: 這是多個線程間的一種協作機制。談到線程我們經常想到的是線程間的競爭(race),比如去爭奪鎖,但這並不是 故事的全部,線程間也會有協作機制。就好比在公司裏你和你的同事們,你們可能存在在晉升時的競爭,但更多時 候你們更多是一起合作以完成某些任務。 就是在一個線程進行了規定操作後,就進入等待狀態(wait()), 等待其他線程執行完他們的指定代碼過後 再將 其喚醒(notify());在有多個線程進行等待時, 如果需要,可以使用 notifyAll()來喚醒所有的等待線程wait/notify 就是線程間的一種協作機制
在這裏插入圖片描述
等待喚醒中的方法:等待喚醒機制就是用於解決線程間通信的問題的,使用到的3個方法的含義如下:

  1. wait:線程不再活動,不再參與調度,進入 wait set 中,因此不會浪費 CPU 資源,也不會去競爭鎖了,這時 的線程狀態即是 WAITING。它還要等着別的線程執行一個特別的動作,也即是“通知(notify)”在這個對象 上等待的線程從wait set 中釋放出來,重新進入到調度隊列(ready queue)中
  2. notify:則選取所通知對象的 wait set 中的一個線程釋放;例如,餐館有空位置後,等候就餐最久的顧客最先 入座。
  3. notifyAll:則釋放所通知對象的 wait set 上的全部線程。

注意哪怕只通知了一個等待的線程,被通知線程也不能立即恢復執行,因爲它當初中斷的地方是在同步塊內,而 此刻它已經不持有鎖,所以她需要再次嘗試去獲取鎖(很可能面臨其它線程的競爭),成功後才能在當初調 用 wait 方法之後的地方恢復執行。 總結如下: 如果能獲取鎖,線程就從 WAITING 狀態變成 RUNNABLE 狀態; 否則,從 wait set 出來,又進入 entry set,線程就從 WAITING 狀態又變成 BLOCKED 狀態

調用wait和notify方法需要注意的細節:

  1. wait方法與notify方法必須要由同一個鎖對象調用。因爲:對應的鎖對象可以通過notify喚醒使用同一個鎖對 象調用的wait方法後的線程。
  2. wait方法與notify方法是屬於Object類的方法的。因爲:鎖對象可以是任意對象,而任意對象的所屬類都是繼承了Object類的。
  3. wait方法與notify方法必須要在同步代碼塊或者是同步函數中使用。因爲:必須要通過鎖對象調用這2個方法。
    在這裏插入圖片描述

等待喚醒機制需求分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章