程序是資源共享的,執行緒是資源私有的。
死鎖的四個必要條件
在計算機專業的本科教材中,通常都會介紹死鎖的四個必要條件。這四個條件缺一不可,或者說只要破壞了其中任何乙個條件,死鎖就不可能發生。我們來複習一下,這四個條件是:
•互斥(mutual exclusion):存在這樣一種資源,它在某個時刻只能被分配給乙個執行緒(也稱為執行緒)使用;
•持有(hold and wait):當請求的資源已被占用從而導致執行緒阻塞時,資源占用者不但無需釋放該資源,而且還可以繼續請求更多資源;
•不可剝奪(no preemption):執行緒獲得到的互斥資源不可被強行剝奪,換句話說,只有資源占用者自己才能釋放資源;
•環形等待(circular wait):若干執行緒以不同的次序獲取互斥資源,從而形成環形等待的局面,想象在由多個執行緒組成的環形鏈中,每個執行緒都在等待下乙個執行緒釋放它持有的資源。
對於每個執行緒都需要得到最大資源才能工作的情況下,避免死鎖有如下的一般程式設計實踐:
(1)請勿嘗試在可能會對效能造成不良影響的長時間操作(如 i/o)中持有鎖;
(2)請勿在可能直接或間接遞迴呼叫自己的函式裡持有鎖;
(3)一般情況下,請先使用粗粒度鎖定方法,確定瓶頸,並在必要時新增細粒度鎖定來緩解瓶頸。大多數鎖定都是短期持有,而且很少出現爭用。因此,請僅修復測得爭用的那些鎖定;
(4)使用多個鎖定時,通過確保所有執行緒都按相同的順序獲取鎖定來避免死鎖;
(5)在等待某個資源時,使用超時機制;
(6)在系統中使用乙個定時檢查死鎖環的機制,如果發現死鎖就讓乙個執行緒的資源釋放掉(資料庫好像就是用這種方式)。
jdk自帶了兩個工具(jstack和jconsole),可以用來監測分析死鎖的發生原因。
jstack工具用於生於生成虛擬機器當前時刻的執行緒快照。執行緒快照就是當前虛擬機器每一條執行緒正在
執行的方法堆疊的集合,生成快照可以用於定位諸如執行緒死鎖、死迴圈等問題。
1.找到執行當前程式的jvm的程序id,命令及結果如下
2.執行jstack命令,並將結果資訊匯出來
3.使用文字編輯器開啟剛匯出的文字,只要檢視最後關於死鎖的堆疊資訊即可
4.直接從堆疊資訊不能直觀得到結論,沒關係,我們可以畫圖理清執行緒間的排程情況
(出現閉合環路,發生死鎖)
多執行緒執行原理分析 GiL鎖 執行緒互斥鎖
首先丟擲問題 1.gil鎖和執行緒互斥鎖在整個程式中有何屌用?鎖的是什麼?2.多執行緒究竟是如果競爭offer?作業系統 直譯器 執行多執行緒的流程?直接貼圖 個人理解 參考繪製,如有問題,請指正 解釋 t1 1.執行緒1和執行緒2分別讀取共享資料池變數a的指標 2.t1競爭到gil鎖,cpytho...
執行緒與訊號,執行緒與鎖
include include includepthread mutex t number mutex pthread mutex initializer int globvar 0 void write p void arg void read p void arg int main sleep ...
執行緒安全與鎖
1 原子操作 操作只有一步,不會被其他的操作打斷 2 系統一般會帶有一些原子操作的函式留給使用者使用,但是數量較少,並且一般只能用於簡單特定的場合 1 鎖就是乙個flag,他的作用是說現在某個資源正在被某個執行緒使用,別的執行緒都別想輕易的拿去使用,巨集觀上表現就好像是給這些資源新增了乙個鎖,被鎖住...