死鎖原理的分析

2021-08-20 19:31:20 字數 600 閱讀 7005

死鎖產生的條件

避免死鎖

在程式中可以把執行變更抽象為對某種物件的狀態的變更。在多執行緒環境下,如果乙個狀態無法在單個指令中完成,那麼多個執行緒同時變更該狀態可能導致該狀態的不一致。

我們這裡還用熟悉的轉賬案列。

這裡邊要執行的操作是是從a 的餘額 s(a) - 50, 同時b 的餘額 s(b) + 50。 由於在計算獲取到s(a),s(b)後,a 賬戶餘額還可能發生變化(比如a設定了每月信用卡自動還款),如果這時還是用s(a) 進行計算,就放生了錯誤。所以為了保證在轉賬的過程中s(a), s(b) 是不變的, 我們需要在轉賬開始的時候,對a, b 賬戶同時枷鎖, 這樣保證了在轉賬結束前,沒有其他操作導致s(a), s(b)發生變化,我們就可以安全的使用s(a), s(b) 進行計算了。

a 轉賬的操作 1,lock(a) 2,lock(b) 3, 轉賬操作 4,unlock(b) , 5unlock(a)

b 轉帳的操作 1,lock (b) 2,lock( a ) 3,轉賬操作 4,unlock(a ), 5,unlock(b)

a,b 要給對方轉賬都需要4個步驟

針對死鎖產生的條件, 可以使用一些規避方案

HashMap死鎖原因分析及原理

一 hashmap原理 1.hashmap的本質就是陣列和鍊錶。table是乙個entry陣列,每乙個陣列元素儲存乙個entry節點,而entry節點內部又連線著同樣key的下乙個entry節點,就構成了鍊錶。詳情見 hashmap原始碼分析 2.hashmap死鎖原因 hashmap會造成死鎖,因...

1 2 死鎖 原理

兩個執行緒,假設第乙個執行緒先執行了execute1拿到lock1 鎖標記,sleep,讓出cpu時間片 第二個執行緒 拿到lock2。此時執行緒1嘗試拿lock2 始終拿不到,執行緒2也是如此,所以進入死鎖狀態。public class demothread12 catch interrupted...

死鎖案例分析

死鎖的產生以及解決辦法,看 分析,注意裡邊的注釋,自行執行。package thread 模擬買票 author yhl class thread02 implements runnable else 同步 塊 public void sale catch interruptedexception ...