21 執行緒的活性故障 鎖死

2021-09-11 09:24:00 字數 920 閱讀 7023

等待執行緒由於喚醒其所需的條件永遠無法成立,或者其他執行緒無法喚醒這個執行緒而一直處於非執行狀態(執行緒並未終止)導致其任務 一直無法進展,那麼我們就稱這個執行緒被鎖死。

訊號丟失鎖死是由於沒有相應的通知執行緒來喚醒 等 待執行緒而使等待執行緒一直處於等待狀態的一種活性故障 。訊號丟失鎖死的乙個典型例子是等待執行緒在執行object.wait()/condition.await()前沒有對保護條件進行判斷,而此時保護條件實際上可能巳然成立 ,然而此後可能並無其他執行緒更新相應保護條件涉及的共享變數使其成立並通知等待執行緒,這就使得等待執行緒一直處於等待狀態,從而使其任務一直無法進展。

巢狀監視器鎖死是巢狀鎖導致等待執行緒永遠無法被喚醒的一種活性故障。假設某個程式使用如下圖所示的受保護方法及相應的通知方法來實現」 等待/通知」。

等待執行緒在其執行到 monitory.wait()的時候會被暫停並且其所持有的鎖 monitory 會被釋放,但是等待執行緒所持有的外層鎖 monitorx 並不會因此(object.wait()呼叫)而被釋放。通知執行緒在呼叫 monitory.notifyall()來喚醒等待執行緒時需要持有相應的鎖 monitory, 但是由於 monitory 所引導的臨界區位於 monitorx 引導的臨界區之內,因此通知執行緒必須先持有外層鎖 monitorx。而通知執行緒執行通知方法的時候,其所需申請的monitorx 可能正好被等待執行緒所持有,因此通知執行緒無法喚醒等待執行緒。而等待執行緒只有在被喚醒之後(退出內層臨界區)才能夠釋放其持有的外層鎖 monitorx。於是,通知執行緒始終無法獲得鎖 monitorx, 從而無法通過 monitory.notifyaii()呼叫來喚醒等待執行緒,這使得等待執行緒一直處於非執行狀態(這裡是 blocked 狀態)。這種由於巢狀鎖導致通知執行緒始終無法喚醒等待執行緒的活性故障就被稱為巢狀監視器鎖死 。

20 執行緒的活性故障 死鎖

死鎖是執行緒的一種常見活性故障。如果兩個或者更多的執行緒因相互等待對方而被永遠暫停 執行緒的生命週期狀態為 blocked 或者 waiting 那麼我們就稱這些執行緒產生了死鎖 deadlock 由於產生死鎖的執行緒的生命週期狀態永遠是非執行狀態,因此這些執行緒所要執行的任務也永遠無法進展。死鎖產...

第七章 執行緒的活性故障

死鎖會導致相關執行緒一直被暫停使得其任務無法進展。產生死鎖的必要條件包括 資源互斥 資源不可搶占 占用並等待資源以及迴圈等待資源。我們可以通過檢視執行緒轉儲手工檢測死鎖,也可以利用threadmxbean.finddeadlockedthreads 方法進行死鎖的自動檢測。死鎖的規避方法包括 粗鎖法...

QT下執行緒鎖死的問題

qt下多執行緒乙個函式 time manage state federate gettimestate 執行時發現其鎖死了。檢查後發現原因 多重同步鎖問題。即在此函式外又加了一層鎖,導致兩次鎖定衝突。mutex.lock while gettimestate time advance grant c...