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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/465007.html
標籤:其他
