一個去阿裡面試的小伙伴私信我說:今天被一個死鎖的問題難到了。 平常我都特意看了死鎖這塊的內容,但是回答的時候就想不起來。 這裡可能存在一個誤區,認為技術是要靠記的。 大家可以想想,平時寫代碼的時候,這些代碼是背下來的嗎? 遇到一個需求的時候,能夠立刻提供解決思路,這個也是記下來的嗎? 所有的技術問題 ...
一個去阿裡面試的小伙伴私信我說:今天被一個死鎖的問題難到了。
平常我都特意看了死鎖這塊的內容,但是回答的時候就想不起來。
這裡可能存在一個誤區,認為技術是要靠記的。
大家可以想想,平時寫代碼的時候,這些代碼是背下來的嗎?
遇到一個需求的時候,能夠立刻提供解決思路,這個也是記下來的嗎?
所有的技術問題,都可以用一個問題來解決: “如果讓你遇到這個問題,你會怎麼設計”
當你大腦一篇空白時,說明你目前掌握的技術只能足夠支撐你寫CURD的能力。
好了,下麵來看看普通人和高手是如何回答這個問題的。
普通人:
嗯......…
高手:
死鎖,簡單來說就是兩個或者兩個以上的線程在執行的過程中,爭奪同一個共用資源造成的相互等待的現象。
如果沒有外部干預,線程會一直阻塞無法往下執行,這些一直處於相互等待資源的線程就稱為死鎖線程。
導致死鎖的條件有四個,也就是這四個條件同時滿足就會產生死鎖。
- 互斥條件,共用資源 X 和 Y 只能被一個線程占用;
- 請求和保持條件,線程 T1 已經取得共用資源 X,在等待共用資源 Y 的時候,不釋放共用資源 X;
- 不可搶占條件,其他線程不能強行搶占線程 T1 占有的資源;
- 迴圈等待條件,線程 T1 等待線程 T2 占有的資源,線程 T2 等待線程 T1 占有的資源,就是迴圈等待。
導致死鎖之後,只能通過人工干預來解決,比如重啟服務,或者殺掉某個線程。
所以,只能在寫代碼的時候,去規避可能出現的死鎖問題。
按照死鎖發生的四個條件,只需要破壞其中的任何一個,就可以解決,但是,互斥條件是沒辦法破壞的,因為這是互斥鎖的基本約束,其他三方條件都有辦法來破壞:
- 對於“請求和保持”這個條件,我們可以一次性申請所有的資源,這樣就不存在等待了。
- 對於“不可搶占”這個條件,占用部分資源的線程進一步申請其他資源時,如果申請不到,可以主動釋放它占有的資源,這樣不可搶占這個條件就破壞掉了。
- 對於“迴圈等待”這個條件,可以靠按序申請資源來預防。所謂按序申請,是指資源是有線性順序的,申請的時候可以先申請資源序號小的,再申請資源序號大的,這樣線性化後自然就不存在迴圈了。
以上就是我對這個問題的理解。
總結
發現了嗎? 當大家理解了死鎖發生的條件,那麼對於這些條件的破壞,
是可以通過自己的技術積累,來設計解決方法的。
所有的技術思想和技術架構,都是由人來設計的,為什麼別人能夠設計?
本質上,還是技術積累後的結果!越是底層的設計,對於知識面的要求就越多。
好的,本期的普通人VS高手面試系列就到這裡結束了,喜歡的朋友記得點贊收藏。
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自
Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!