活躍性故障
當出現活躍性故障時,中止應用程序並且嘗試重啓
(一)死鎖
鎖順序死鎖:兩個方法間鎖不按照順序調用導致死鎖
動態鎖順序死鎖:兩個線程調用一個方法,調用方法過程中不按順序調用鎖導致死鎖。通過鎖順序避免死鎖。
協作對象之間發生死鎖:兩個對象間,解決辦法,放開調用(同步方法改成同步塊)
資源死鎖:有界線程池/資源池與相互依賴的任務不能一起使用。
死鎖的避免:避免死多確保線程在獲取多個鎖時採用一致的順序。
1、放開調用:在確保不需要方法原子性的基礎上,將同步方法改成同步塊。減少需要同時持有多個鎖的地方。
2、支持定時的鎖:使用Lock類中定時的tryLoc代替內置鎖機制。在等待超時後,tryLock會返回一個失敗信息。
(二)飢餓:避免使用線程的優先級,因爲會增加平臺的依賴性,並可能導致活躍性問題。可以通過Thread.sleep()和Thread.yield()克服優先級調整或者響應性問題。
(三)糟糕的響應性:不良鎖的管理,eg某個線程長時間佔有一個鎖,而其他想要訪問這個容器的線程就必須等待很長的時間。可以使用類似的同步容器代替。
(四)活鎖:很有禮貌的兩個鎖相互讓。通過等待隨機長度的時間和回退可以有效避免活鎖的發生。