線程的活性故障

本文摘抄自《Java 多線程編程實戰指南》核心篇 第七章小結

個人博客:DoubleFJ の Blog

本章介紹了常見的線程活性故障以及相應的規避措施。


  死鎖會導致相關線程一直被暫停使得其任務無法進展。產生死鎖的必要條件包括:資源互斥/資源不可搶奪/佔用並等待資源以及循環等待資源。 我們可以通過查看線程轉儲手工檢測死鎖,也可以利用 ThreadMXBean.findDeadlockedThreads() 方法進行死鎖的自動檢測。死鎖的規避方法包括:粗鎖法(使用一個粗粒度的鎖代替多個鎖)/鎖排序法(相關線程使用全局統一的順序申請鎖)/使用 ReentrantLock.tryLock(long,TimeUnit)來申請鎖/使用開放調用(在調用外部方法時不加鎖)以及使用鎖的替代品。使用內部鎖或者使用 lock.lock() 申請的顯式鎖導致的死鎖是無法恢復的;使用 lock.lockInterruptibly()申請的顯式鎖導致的死鎖理論上是可恢復的,但實際可操作性不強——自動恢復的嘗試可能是徒勞且有害的(導致活鎖)。
  鎖死是等待線程由於某種原因一直無法被喚醒而導致其任務無法進展的一種活性故障。 信號丟失鎖死是由於沒有相應的通知線程來喚醒等待線程而使等待線程一直處於等待狀態的一種活性故障。嵌套監視器鎖死是嵌套鎖導致通知線程無法獲得其爲喚醒等待線程所需的鎖從而使其無法喚醒等待線程,最終使得通知線程與等待線程都一直處於等待狀態的一種活性故障。嵌套監視器鎖死可以通過查看線程轉儲進行檢測。爲規避嵌套監視器鎖死,我們應該避免在嵌套鎖的內層臨界區內實現等待/通知。

  線程飢餓指線程一直無法獲得其所需的資源而導致其任務一直無法進展的一種活性故障。 把鎖看成一種資源,那麼死鎖可被看作一種線程飢餓。飢餓可能演變成活鎖。

  活鎖是線程一直在做無用功而使其任務一直無法進展的一種活性故障。 試圖進行死鎖故障恢復可能導致活鎖。

知識圖譜

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