重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
java notify和notifyAll
公司主營業務:網站制作、成都網站制作、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。創新互聯公司是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創新互聯公司推出涵江免費做網站回饋大家。
首先從名字可以了解,notify是通知一個線程獲取鎖,notifyAll是通知所有相關的線程去競爭鎖。
notify不能保證獲得鎖的線程,真正需要鎖,并且可能產生死鎖。
舉例1:
所有人(消費者線程)準備吃飯,食堂沒有開放(沒有釋放鎖)打飯窗口(鎖),所有人等待(WAITING)。
食堂開飯打飯窗口(釋放鎖),并廣播消息“開飯了”(notifyAll),所有人競爭排隊,并等待吃飯(BLOCKED)。每一個人依次在打飯窗口(獲得鎖)打飯(RUNNABLE)。如果想吃飯就打完飯后離開(釋放鎖),不想吃飯就直接離開(釋放鎖)。如果吃完了還想吃,就主動等待下一次“開飯了”的消息(wait)。
食堂通知一個人來吃飯(notify),此人來到打飯窗口(獲得鎖)打飯(RUNNABLE),其他人都在等待開飯的消息(WAITING)。如果想吃飯就打完飯后離開(釋放鎖),不想吃飯就直接離開(釋放鎖)。如果吃完了還想吃,就主動等待下一次“開飯”的消息(WAITING)。
notify不能保證通知到真正想吃飯的人。
舉例2:
兩個生產者P1、P2,兩個消費者C1、C2,共同操作一個隊列,隊列最大長度為1。
開始P1、P2、C1、C2都處于運行狀態(RUNNABLE)。
C1先獲得鎖,P1、P2、C2為BLOCKED狀態。C1發現隊列為空,主動進入WAITING。C2接著獲得鎖,成為RUNNABLE狀態,發現隊列為空,主動進入WAITING。
P1接著獲得鎖,成為RUNNABLE狀態,在隊列中插入一個元素,notify到了另一個生產者P2。P1循環生產,發現隊列不為空,成為WAITING。
P2成為RUNNABLE狀態,發現隊列有值,主動進入WAITING。
此時鎖已被釋放,但P1、P2、C1、C2都處于WAITING狀態,沒有線程去獲取鎖,死了。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!