Java併發編程實戰(四)活躍性

活躍性故障

當出現活躍性故障時,中止應用程序並且嘗試重啓

(一)死鎖

鎖順序死鎖:兩個方法間鎖不按照順序調用導致死鎖

動態鎖順序死鎖:兩個線程調用一個方法,調用方法過程中不按順序調用鎖導致死鎖。通過鎖順序避免死鎖。

協作對象之間發生死鎖:兩個對象間,解決辦法,放開調用(同步方法改成同步塊)

資源死鎖:有界線程池/資源池與相互依賴的任務不能一起使用。


死鎖的避免:避免死多確保線程在獲取多個鎖時採用一致的順序。

1、放開調用:在確保不需要方法原子性的基礎上,將同步方法改成同步塊。減少需要同時持有多個鎖的地方。

2、支持定時的鎖:使用Lock類中定時的tryLoc代替內置鎖機制。在等待超時後,tryLock會返回一個失敗信息。

(二)飢餓:避免使用線程的優先級,因爲會增加平臺的依賴性,並可能導致活躍性問題。可以通過Thread.sleep()和Thread.yield()克服優先級調整或者響應性問題。

(三)糟糕的響應性:不良鎖的管理,eg某個線程長時間佔有一個鎖,而其他想要訪問這個容器的線程就必須等待很長的時間。可以使用類似的同步容器代替。

(四)活鎖:很有禮貌的兩個鎖相互讓。通過等待隨機長度的時間和回退可以有效避免活鎖的發生。

發佈了51 篇原創文章 · 獲贊 24 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章