成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于死鎖,面試的一切都在這里了

開發 前端
邏輯其實非常簡單,我們申請兩個資源,開兩個線程,每個線程持有其中的一個資源,并且互相請求對方的資源,就構成了死鎖。

什么是死鎖(Deadlock)

死鎖是指兩個或兩個以上的線程在執行過程中,因爭奪資源而造成的一種互相等待的現象。若無外力作用,它們都將無法推進下去。

圖片

產生死鎖的四個必要條件得爛熟于心:

  • 互斥條件:進程要求對所分配的資源進行排他性控制,即在一段時間內某資源僅為一個進程所占用。此時若有其他進程請求該資源,則請求進程只能等待。
  • 不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能由獲得該資源的進程自己來釋放。
  • 請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
  • 循環等待條件:存在一種進程資源的循環等待鏈,連中每一個進程已獲得的資源同時被鏈中下一個進程所請求。

相應的,如果想在程序運行之前預防發生死鎖(也成為 “死鎖預防”),必須設法破壞產生死鎖的四個必要條件之一

  • 破壞互斥條件:允許系統資源都能共享使用,則系統不會進行死鎖狀態。這種方案并不太可行,因為有些資源根本就不能同時訪問,比如打印機。
  • 破壞不剝奪條件:當一個已經保持了某些不可剝奪資源的進程,請求新的資源時得不到滿足,它必須釋放已經保持的所有資源,待以后需要時再重新申請。這種方法常用于狀態易于保存和恢復的資源,如 CPU 的寄存器及內存資源,一般不能用于打印機之類的資源。
  • 破壞請求和保持條件:采用預先靜態分配方法,即進程在運行前一次申請完他所需要的全部資源,在他的資源未滿足前,不把它投入運行。一旦運行后,這些資源就一直歸它所有,也不再提出其他資源請求,這樣就可以保證系統不會發生死鎖。
  • 破壞循環等待條件:采用順序資源分配法。首先給系統中的資源編號,規定每個進程,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進程提出申請分配資源,則該進程在以后的資源申請中,只能申請編號比之前大的資源。

光看羅列出來的幾點文字肯定還是不能完全理解,下面會結合實例來給大伙解釋。

用 Java 寫一個死鎖

這絕對是面試中 Java 手寫題的 TOP2!!!除了人盡皆知的手寫單例模式,手寫死鎖可能有些小伙伴會遺漏掉。

邏輯其實非常簡單,我們申請兩個資源,開兩個線程,每個線程持有其中的一個資源,并且互相請求對方的資源,就構成了死鎖。

圖片

MySQL 死鎖

MySQL 經典的死鎖案例

下面來看個 MySQL 經典的死鎖案例:轉賬

A 賬戶給 B 賬戶轉賬 50 元的同時,B 賬戶也給 A 賬戶轉賬 30 元

圖片

正常情況下,如果只有一個操作,A 給 B 轉賬 50 元,可以在一個事務內完成,先獲取 A 用戶的余額和 B 用戶的余額,因為之后需要修改這兩條數據,所以需要通過寫鎖(for UPDATE)鎖住他們,防止其他事務更改導致我們的更改丟失而引起臟數據

圖片

圖片

但如果 A 給 B 轉賬和 B 給 A 轉賬同時發生,那就是兩個事務,可能發生死鎖:

1)A 用戶給 B 用戶轉賬 50 元,需在程序中開啟事務 1 來執行 SQL,獲取 A 的余額同時鎖住 A 這條數據。

圖片

2)B 用戶給 A 用戶轉賬 30 元,需在程序中開啟事務 2 來執行 SQL,并獲取 B 的余額同時鎖住 B 這條數據。

圖片

3)在事務 1 中執行剩下的 SQL,此時事務 1 是獲取不到 B 的鎖的,也即 select for update 就會被阻塞住;

圖片

4)同理,事務 2 繼續執行剩下的 SQL,請求 A 的鎖,也是獲取不到的

事務 1 和事務 2 存在相互等待獲取鎖的過程,導致兩個事務都掛起阻塞,最終拋出獲取鎖超時的異常。

圖片

如何解決 MySQL 死鎖

要想解決上述死鎖問題,我們可以從死鎖的四個必要條件入手。

指導思想其實很明確:就是保證 A 向 B 轉賬和 B 向 A 轉賬這兩個事務同一時刻只能有一個事務能成功獲取到鎖

由于互斥和不剝奪是鎖本質的功能體現,無法修改,所以咱們從另外兩個條件嘗試去解決。

1)破壞 “請求和保持” 條件:A 和 B 之間的操作用同一個鎖鎖住(比如用 Redis 分布式鎖做,A 和 B 之間的鎖的 key 表示為 A:B,可以讓 id 小的用戶排在前面,id 大的用戶排在后面,這樣來設計 key。如果存在分庫分表的情況,用 hashcode 來做比較也行),保證 A 向 B 轉賬和 B 向 A 轉賬這兩個事務同一時刻只能有一個事務能成功獲取鎖

圖片

2)破壞 “循環等待” 條件:先獲取更小的鎖,獲取到了小的鎖才能獲取大鎖(所謂小鎖還是大鎖,也可以簡單的根據用戶的 id 來進行區分,先請求用戶 id 較小的,再請求用戶 id 較大的)。比如 A.id < B.id,那么 A 和 B 之間的操作,都是要先獲取 A 鎖,再獲取 B 鎖

圖片

具體代碼可參考如下:

? 圖片 ?

責任編輯:武曉燕 來源: 飛天小牛肉
相關推薦

2016-03-01 16:14:32

問問應用商店Android Wea

2019-08-13 17:10:18

鍵盤機械鍵帽

2024-11-11 10:17:00

AI技術

2019-10-12 10:52:54

數據IoT邊緣計算

2020-04-29 09:25:35

iOS 14蘋果iPhone

2025-05-16 09:34:10

2019-04-11 14:51:12

數據

2023-08-11 08:00:00

人工智能Keras 3.0

2018-04-26 16:15:02

數據庫MySQLMySQL 8.0

2018-03-19 14:43:28

2017-10-24 14:57:58

AI人工智能機器學習

2015-01-15 09:35:30

2016-05-20 11:14:55

內容緩存 傳輸策略優

2016-05-20 11:26:54

客戶端優化 直播推流

2021-06-17 13:40:47

區塊鏈比特幣公有鏈

2021-10-06 16:21:32

類型對象Typescript

2023-12-11 21:59:01

時序分析深度學習自回歸模型

2016-05-16 12:08:08

UCloud 直播云

2024-09-18 09:08:00

AIGitHubOpenAI

2016-05-12 14:54:39

UCloud
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区在线 | 欧美在线一区二区视频 | 91免费观看国产 | 福利视频二区 | 免费成人午夜 | 怡红院免费的全部视频 | 91视频久久 | 久久最新精品视频 | 99精品视频在线观看免费播放 | 成人福利 | a在线视频 | 亚洲手机视频在线 | 国产资源网 | 亚洲狠狠爱一区二区三区 | 99re热精品视频国产免费 | 日本不卡一区二区三区 | 中文字幕成人 | 午夜a级理论片915影院 | 久久精品视频91 | 一区二区三区影院 | 91在线观看视频 | 一二三四在线视频观看社区 | 精品1区2区 | 日本不卡免费新一二三区 | 国产高清免费 | 日韩一区二区三区精品 | 在线免费观看a级片 | 国产精品成人品 | 国产精品免费一区二区三区四区 | 精品国产乱码久久久久久88av | 成人免费视频网站在线看 | 久久久妇女国产精品影视 | 日韩看片 | 国产黄色av网站 | 免费网站国产 | 日本午夜免费福利视频 | 成人欧美一区二区三区在线播放 | 超碰成人免费 | 亚洲精品视频久久 | 久久久久综合 | 日韩欧美在线免费观看 |