您的位置

360足球直播绿色直播:線程活躍性問題及其解決方案

來源:2012奥运会足球直播表 點擊:869

2012奥运会足球直播表 www.ubmml.com.cn 1.什么是死鎖

死鎖發生在并發中。當兩個或更多線程持有彼此的資源但不主動釋放它們時,兩個線程都不能前進,因此陷入無休止的等待就是死鎖。

例如,上圖中的兩個線程持有彼此需要的鎖,但他們不愿意釋放鎖,因此陷入死鎖。

在多線程的情況下,存在循環依賴關系,這可能導致死鎖。例如,如上圖所示,線程1持有鎖A以獲取鎖B,線程2持有鎖B以獲取鎖C,線程3持有鎖C以獲取鎖A,但是每個線程拒絕放棄其持有的鎖,從而導致死鎖。

2。死鎖的影響

死鎖的影響在不同的系統中是不同的,這取決于系統處理死鎖的能力。

可以在數據庫中檢測和放棄某些東西,如果發生搶占,可以指定一個事務放棄,這可以解決死鎖。然而,在JVM中沒有自動處理能力。

死鎖發生的可能性很小,但它會造成很大的危害。在多線程并發的情況下,它將影響更多的用戶。

死鎖會導致整個系統崩潰,子系統崩潰,性能下降。壓力測試不能發現所有潛在的死鎖

3。死鎖示例

3.1查看程序停止

3.2銀行轉帳中的死鎖信號

先決條件:需要兩個鎖(鎖定轉帳和被轉移的線程,以確保中間不被干擾)。如果成功獲得兩個鎖,并且余額大于0,則扣除轉讓人和增加收款人的余額是原子操作。

逆序導致死鎖。

刪除評論不會出現死鎖,但添加后500ms內會出現死鎖。

3.3模擬多人轉賬

死鎖概率隨著賬號

4的減少而增加。死鎖的四個必要條件(不需要)

互斥:當獲得時,其他線程不能獲得它。

請求并保持:當你得到它時,你也必須得到它。

不可剝奪:在數據庫中可以避免死鎖,因為數據庫本身可以剝奪一個事務,從而避免死鎖,但在Java中不能。

循環等待:兩個線程在兩個線程中互相等待,多個線程中的每個線程首尾相連形成一個循環,即循環等待發生。

5。如何定位死鎖

5.1 ThreadMXBean代碼演示

找到死鎖后,您可以通過報警或記錄來修復死鎖。

6。如何修復死鎖

6.1如何修復在線發生的死鎖

要修復死鎖而不丟失在線問題是絕對不可能的。所以

需要保存“犯罪現場”并立即重啟服務器。

暫時確保在線服務的安全,然后立即使用留下的信息定位死鎖,修復它,然后重新發送版本。

6.2死鎖修復策略

避免策略:哲學家就餐換手方案和轉移換序方案

思考:避免獲取鎖的逆序

檢測和恢復策略:在一段時間內檢查死鎖;如果發生死鎖,則剝奪修復死鎖的資源。

鴕鳥策略:鴕鳥是一種動物,當它遇到危險時會把頭埋在地上,這樣它就看不到危險了。這意味著,當發生的概率較低時,可以暫時忽略死鎖,并且可以在發生后進行手動修復。

6.2.1避免使用策略

通過修改傳遞方法來計算傳入和傳出的哈希值,并通過比較哈希值來設置鎖的獲取順序,從而避免死鎖。

7。哲學家進餐問題

7.1什么是哲學家進餐問題

每個哲學家在吃飯前需要拿起左手的叉子(或右手的叉子),然后拿起右手的叉子(或左手的叉子)。等到他用完了,放回原處,然后用叉子叉另一個人(暫時不考慮健康問題:)。

死鎖:如果每個人都同時拿起左邊的叉子,右邊的叉子就拿不到,從而導致等待的問題。

僵局的一個主要特征是每個哲學家左手拿著筷子,右手拿不到筷子。

7.2解決哲學家死鎖問題的四種方法

服務員檢查(回避策略)

改變持有叉子的哲學家的順序(回避策略)

餐券(將票券數量設置為-1)(回避策略)

領導調整(檢測和恢復策略)

7.2.1握手策略的實施

7.2.2死鎖檢測和恢復策略

檢測算法:鎖調用鏈接圖

允許死鎖

記錄每次鎖調用

定期檢查鎖調用鏈接圖是否形成循環

一旦死鎖發生,使用死鎖恢復機制恢復

恢復方法1:進程終止

逐個終止線程。直到死鎖消除

終止命令:

1。優先級(前臺交互或后臺處理)

2。已經占用和需要的資源

3。時間已經運行

恢復方法2:資源搶占

撤銷每個分布式鎖

允許線程后退幾步,這樣整個線程就不需要結束,成本相對較低,但這可能會導致資源一直被搶占。導致饑餓

8。避免死鎖的有效方法

8.1設置超時(后退一步)鎖的嘗試鎖(長超時)。TimeUnit unit)

synchronized不能嘗試鎖

8.2使用并發類而不是設計鎖

ConcurrentHashMap,ConcurrentLinkedQueue,AtomicBoolean

Java . util . concurrent . atomic在實際使用時非常有用。它比Lock

多用途并發集簡單、方便、高效。同步集使用較少,并發集比同步集具有更好的可伸縮性。并發場景需要

map。首先,考慮使用ConcurrentHashMap

8.3來降低使用鎖的粒度,避免使用同一個鎖

來?;し段Т?、效率低、容易死鎖

8.4嘗試使用同步代碼塊而不是同步方法

使用相對于同步方法的同步代碼塊,減少?;し段?,增加對對象的控制,并降低死鎖的風險。

8.5給一個線程一個有意義的名字

8.6避免鎖的嵌套

例如,上面的MustDeadLock類

8.7將在分配資源之前查看它是否可以被檢索

例如:銀行家算法

8.8特殊鎖

盡量不要對多個函數使用同一鎖

9。其他活動問題

死鎖是最常見的活動問題,但是除了剛才的死鎖之外,還有一些類似的問題會導致程序無法順利執行,統稱為活動問題。

9.1 livelock

9.1.1什么是livelock

然后回到以前哲學家的用餐問題,死鎖發生是因為每個哲學家首先得到左手餐具,并且總是等待右手餐具(反之亦然),因此死鎖將會發生。

動態鎖比死鎖更智能。這些哲學家同時進入餐廳,拿起左邊的餐具,等5分鐘,然后放下餐具,再等5分鐘,同時拿起餐具。這也會導致每個哲學家無法進食。

在程序中,程序一直在運行,但它是無用的,是資源的浪費。

9.1.2活鎖的出現

9.1.3如何解決活鎖問題

活鎖的原因:重試機制不變,消息隊列總是重試,吃飯總是彬彬有禮

解決方案:添加隨機因素

9.1.4代碼演示

9.2饑餓

當一個線程需要一些資源(如中央處理器)時,它總是不能得到

饑餓原因

當一個線程的執行優先級太低時,它總是不能得到中央處理器資源

一個線程總是持有鎖,但它從不釋放鎖

一個程序總是占用一個文件的寫鎖。

饑餓可能導致響應性差:例如,一個線程負責前臺的響應,另一個線程負責后臺的數據處理。然而,由于前臺線程的低優先級,它不能一直被執行,這將導致糟糕的用戶體驗。

饑餓可能導致響應性差:例如,一個線程負責前臺的響應,另一個線程負責后臺的數據處理。然而,由于前臺線程的低優先級,它不能一直被執行,這將導致糟糕的用戶體驗。

-



{ganrao} 广东十一选五助手苹 湖北30选5走势图 青海快3 小泽玛利亚aⅴ高清作品 股票指数的计算方法有几种 李嘉诚理财方法诚简介 灰熊vs马刺比分 舍伍德的罗宾 麻将下分 掘金vs奇才 广东十一选五牛 竞彩足球比分 无忧天下番号网 相泽南 福建31选7今天开 雪缘园英超 西宁按摩会所那里有00后小妹