避免死鎖主要有 3種方式
- 加鎖順序
- 加鎖時限
- 死鎖檢測
加鎖順序
一個線程如果要獲取多個鎖箱锐,必須按照一定的順序去獲取,比如要獲取A B C 三把鎖劳较,我們規(guī)定驹止,必須獲取到了 AB 兩把鎖,才能去獲取 C鎖
舉個例子 現(xiàn)在有兩個線程 都要去獲取 ABC 三把鎖
然后 1號 線程 獲取到了 A 和 B 兩把鎖
2號 線程獲取了 C鎖
于是 1號線程在等待 2號線程釋放鎖C鎖
2號線程在等待 1 號線程釋放 A 和 B 鎖
于是出現(xiàn)了死鎖
現(xiàn)在采用加鎖隊列后观蜗,必須先 獲取 A 和 B 才能獲取C鎖臊恋,所以 2號線程就沒有機(jī)會在沒有獲取 AB 的情況下拿到C鎖,就不會出現(xiàn)死鎖問題
這個策略的最大問題是墓捻,你必須提前知道所有用到的鎖抖仅,這個有些時候難以預(yù)測
加鎖時限
一個線程嘗試去獲取鎖,如果在指定的時間內(nèi)獲取不到砖第,就放棄等待鎖撤卢,并釋放自己現(xiàn)在所持有的鎖,然后隨機(jī)等待一定時間梧兼,再去獲取鎖
這里要注意的是 放吩,等待的時間一定要是隨機(jī),不然可能出現(xiàn) 兩個線程都釋放資源羽杰,然后等待相同時間渡紫,然后再一起去獲取鎖,于是又死鎖忽洛,這種現(xiàn)象稱為活鎖
死鎖檢測
利用數(shù)據(jù)結(jié)構(gòu)腻惠,如 一個map,然后每次線程的上鎖,和獲取不到鎖欲虚,都記錄在里面集灌,當(dāng)一個線程獲取不到鎖的時候,就去便利查看這個map复哆,看一下有沒有死鎖欣喧,有的話就將整個map里所有的鎖全部釋放,然后各個線程稍作等待梯找,再去競爭鎖唆阿。
這里還可以優(yōu)化下,設(shè)置優(yōu)先級锈锤,釋放所有鎖的時候驯鳖,不釋放優(yōu)先級高的鎖闲询,能提高性能。