技術問答集錦(16)避免活躍性

猿碼道發表於2018-05-04

1 活躍性的概念,哪些場景會存在活躍性問題?

概念:活躍性這個詞代表著某件正確的事情最終會發生。活躍性失敗發生在應用程式觸及一種無法繼續執行的狀態。

場景:(1)在單執行緒的應用程式中,無限迴圈就是一個例子;(2)併發程式設計方面,為保證執行緒安全採用加鎖的方式,但可能造成活躍性問題,例如死鎖、活鎖和飢餓;

2 System.identityHashCode的作用是什麼?

identityHashCode()方法是System類中的靜態方法,根據物件記憶體地址來計算雜湊值。

對於String物件,只要a 和 b 的字串是一樣的,那麼hashCode()方法返回的值必定相同,但是System.identityHashCode()方法不管什麼情況下都不同。

3 多執行緒死鎖情況下,如何解決或避免死鎖?

下面這四個條件是產生死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖,因此可以通過破壞這四個條件之中的任意一個達到避免死鎖的目的

  1. 互斥條件:一個資源每次只能被一個程式使用;
  2. 請求和保持條件:一個程式因請求資源而阻塞時,對已獲得的資源保持不放;
  3. 不可搶佔條件:程式已獲得的資源,在末使用完之前,不能強行剝奪,只能在程式使用完時由自己釋放;
  4. 迴圈等待條件:若干程式之間形成一種頭尾相接的迴圈等待資源關係;

4 Thread Dump資訊當中,如何確認哪兩個執行緒死鎖的?

技術問答集錦(16)避免活躍性
技術問答集錦(16)避免活躍性

5 飢餓鎖是什麼?如何產生的?帶來什麼問題?如何解決?

飢餓鎖:一個或者多個執行緒因為種種原因無法獲得所需要的資源,導致一直無法執行的狀態。

產生原因:(1)高優先順序執行緒吞噬所有的低優先順序執行緒的CPU時間;(2)執行緒被永久堵塞在一個等待進入同步塊的狀態,因為其他執行緒總是能在它之前持續地對該同步塊進行訪問;

解決方案:(1)使用鎖,而不是同步塊;(2)公平鎖;

6 Thread 優先順序的作用?什麼情況下不一定按優先順序順序?

優先順序作用:執行緒的優先順序只能確保CPU儘量將執行的資源讓給優先順序高的執行緒用,但不保證定義的高優先順序的執行緒的都能先於低優先順序的執行緒執行完;

不按照優先順序順序:不同的系統有不同的執行緒優先順序的取值範圍,Java定義了10個級別(1-10)。當不同優先順序的執行緒對應作業系統的同一個優先順序段時會出現不按優先順序順序執行

7 活鎖是什麼?如何產生的?帶來什麼問題?如何解決?

活鎖概念:任務或者執行者沒有被阻塞,但執行緒不斷重複執行相同的操作,但每次操作的結果都是失敗的;

產生原因:由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗;

帶來問題:儘管這個問題不會阻塞執行緒,但是程式也無法繼續執;

解決方案:活鎖的辦法是在每次重複執行的時候引入隨機機制,這樣由於出現的可能性不同使得程式可以繼續執行其他的任務;

相關文章