《Java併發程式設計實戰》 9

2021-08-25 08:45:55 字數 915 閱讀 8411

哲學家問題

通過鎖順序來避免死鎖

如果在持有鎖時呼叫某個外部方法,那麼將出現活躍性問題。在這個外部方法中可能會獲取其他鎖(這可能會產生死鎖),或者阻塞時間過長,導致其他執行緒無法及時獲得當前被持有的鎖。

如果在呼叫某個方法時不需要持有鎖,那麼這種呼叫被稱為開放呼叫(open call)。

在程式中應盡量使用開發呼叫。與那些在持有鎖時呼叫外部方法的程式相比,更易於對依賴於開放呼叫的程式進行死鎖分析。

當多個執行緒早相同的資源集合上等待時,也會發生死鎖。

顯式使用lock類中定時trylock功能代替內建鎖機制可以檢測死鎖和從死鎖中恢復過來。

雖然防止死鎖的主要責任在於你自己,但jvm仍然通過執行緒轉儲(thread dump)來幫助識別死鎖的發生。執行緒轉儲包括各個執行中的執行緒的棧追蹤資訊,這類似發生異常時的棧追蹤資訊。

活躍性危險:

當執行緒由於無法訪問它所需要的資源而無法繼續執行時,就發生了「飢餓」,引發飢餓的最常見資源就是cpu時鐘週期。

要避免使用執行緒優先順序,因為這會增加平台依賴性,並可能導致活躍性問題。在大多數併發應用程式中,都可以使用預設的執行緒優先順序。

活鎖是另一種形式的活躍性問題,該問題儘管不會阻塞執行緒,但也不能繼續執行,因為執行緒將不斷重複地執行相同的操作,並且總會失敗。活鎖通常發生在處理事務訊息的應用程式中:如果蹦年成功處理某個訊息,那麼訊息處理機制將回滾整個事務,並且將它重新發到佇列的開頭。

活躍性故障時乙個非常嚴重的問題,因為當出現活躍性故障時,除了終止應用程式之外沒有其他任何機制可以邦幫助從這些故障中恢復過來。最常見的活躍性故障就是所順序死鎖。在設計時應該避免產生鎖順序死鎖:確保執行緒在獲取多個鎖時採用一致的順序。最好的解決方法是在程式中始終使用開放呼叫。這種大大減少需要同時持有多個鎖的地方,也更容易發現這些地方。

Java併發程式設計實戰 總結

1.可變狀態是至關重要的。所有的併發問題都可以歸結為如何協調對併發狀態的訪問,可變狀態越少,就越容易確保執行緒安全性。2.盡量將域宣告為final型別,除非需要它們是可變的。3.不可變物件一定是執行緒安全的。不可變物件能極大地降低併發程式設計的複雜性。它們更為簡單而且安全,可以任意共享而無須使用加鎖...

java併發程式設計實戰 簡介

1 併發和並行的區別 併發 多個程式在同一時間段執行,只有乙個cpu。並行 多個程式在同一時刻執行,有多個cpu。2 執行緒帶來的風險 1 安全性問題 永遠不發生糟糕的事情 兩個或多個執行緒同時訪問乙個變數,可能會出現差錯。例如,兩個執行緒同時對乙個變數執行讀操作,從而它們得到了相同的值,違背了該變...

《Java併發程式設計實戰》 5

每當看到new thread runnable start 時,並且你希望獲得一種更靈活的執行策略時,請考慮使用excecutor來代替thread。completionservice將execute和blockingqueue的功能融合在一起。executorcompletionservice實現...