如果 notifyAll 在關鍵部分的開始被呼叫,而鎖沒有被釋放并在 cs(critical section) 結束時被釋放怎么辦。等待執行緒會發生什么?
notifyAll 是否會被所有執行緒聽到,并且所有執行緒都會嘗試獲取鎖并失敗(因為 notify/notifyAll 不釋放鎖)并繼續嘗試直到他們獲得鎖?
那么,在臨界區開始或結束時呼叫 notify 有什么區別?為什么建議在 cs 結束時呼叫 notifyAll?
uj5u.com熱心網友回復:
當您呼叫時,notifyAll()所有等待的執行緒都被重新激活并嘗試獲取您呼叫的物件上的鎖notifyAll()。
恕我直言,您的代碼的正確性不會被犧牲 - 只要當前執行緒(呼叫者notifyAll())持有鎖,其他執行緒就無法獲得鎖。
但是性能會受到影響——喚醒執行緒占用處理器資源,讓它們嘗試獲取鎖占用處理器資源,等待釋放鎖占用處理器資源。
通常,在臨界區結束時呼叫的建議很容易notifyAll()實作,因為您的執行緒正在臨界區中進行一些處理,并且在該處理結束時它注意到它應該通知等待執行緒它們可以繼續。在這種情況下,在確定確實如此之前通知其他執行緒它們可以繼續是沒有任何意義的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447439.html
