【面試普通人VS高手系列】死鎖的發生原因和怎麼避免

跟著Mic學架構發表於2022-04-26

一個去阿里面試的小夥伴私信我說:今天被一個死鎖的問題難到了。

平常我都特意看了死鎖這塊的內容,但是回答的時候就想不起來。

這裡可能存在一個誤區,認為技術是要靠記的。

大家可以想想,平時寫程式碼的時候,這些程式碼是背下來的嗎?

遇到一個需求的時候,能夠立刻提供解決思路,這個也是記下來的嗎?

所有的技術問題,都可以用一個問題來解決: “如果讓你遇到這個問題,你會怎麼設計”

當你大腦一篇空白時,說明你目前掌握的技術只能足夠支撐你寫CURD的能力。

好了,下面來看看普通人和高手是如何回答這個問題的。

普通人:

嗯......…

高手:

死鎖,簡單來說就是兩個或者兩個以上的執行緒在執行的過程中,爭奪同一個共享資源造成的相互等待的現象。

image-20210612222402287

如果沒有外部干預,執行緒會一直阻塞無法往下執行,這些一直處於相互等待資源的執行緒就稱為死鎖執行緒。

導致死鎖的條件有四個,也就是這四個條件同時滿足就會產生死鎖。

  • 互斥條件,共享資源 X 和 Y 只能被一個執行緒佔用;
  • 請求和保持條件,執行緒 T1 已經取得共享資源 X,在等待共享資源 Y 的時候,不釋放共享資源 X;
  • 不可搶佔條件,其他執行緒不能強行搶佔執行緒 T1 佔有的資源;
  • 迴圈等待條件,執行緒 T1 等待執行緒 T2 佔有的資源,執行緒 T2 等待執行緒 T1 佔有的資源,就是迴圈等待。

導致死鎖之後,只能通過人工干預來解決,比如重啟服務,或者殺掉某個執行緒。

所以,只能在寫程式碼的時候,去規避可能出現的死鎖問題。

按照死鎖發生的四個條件,只需要破壞其中的任何一個,就可以解決,但是,互斥條件是沒辦法破壞的,因為這是互斥鎖的基本約束,其他三方條件都有辦法來破壞:

  • 對於“請求和保持”這個條件,我們可以一次性申請所有的資源,這樣就不存在等待了。
  • 對於“不可搶佔”這個條件,佔用部分資源的執行緒進一步申請其他資源時,如果申請不到,可以主動釋放它佔有的資源,這樣不可搶佔這個條件就破壞掉了。
  • 對於“迴圈等待”這個條件,可以靠按序申請資源來預防。所謂按序申請,是指資源是有線性順序的,申請的時候可以先申請資源序號小的,再申請資源序號大的,這樣線性化後自然就不存在迴圈了。

以上就是我對這個問題的理解。

總結

發現了嗎? 當大家理解了死鎖發生的條件,那麼對於這些條件的破壞,

是可以通過自己的技術積累,來設計解決方法的。

所有的技術思想和技術架構,都是由人來設計的,為什麼別人能夠設計?

本質上,還是技術積累後的結果!越是底層的設計,對於知識面的要求就越多。

好的,本期的普通人VS高手面試系列就到這裡結束了,喜歡的朋友記得點贊收藏。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!

相關文章