死鎖原因

1.交叉鎖會導致程序死鎖

這個大家都很熟悉了,就是線程A持有R1的鎖又想獲取R2的鎖,線程B持有R2的鎖又想獲取R1的鎖。兩個誰也不放棄自己的又想要對方的,就導致死鎖了。

一般交叉引起的死鎖線程都會進入BLOCKED狀態,CPU資源佔用不高,可以藉助jstack或jconsole工具診斷。

2.內存不足

如兩個線程A和B執行某個任務,A已獲取10MB內存,B已獲取20MB內存,它們執行都需要30MB的內存,但剩餘可用的內存不夠30MB了,兩個線程就有可能都在等待彼此釋放內存資源。

3.C/S數據交換

服務端開啓某端口,等待客戶端訪問,客戶端發送請求立即等待接收,由於某種原因服務端錯過了客戶端的請求,仍在等待,就會陷入雙方都在等待對方發送數據。

4.數據庫鎖

表級別或行級別鎖,比如某個線程執行for update 語句退出了事務,其他線程訪問該數據庫時都將陷入死鎖。

5.死循環引起的死鎖(系統假死)

 

HashMap是線程不安全的,它的put方法會陷入死循環,具體原因參考併發HashMap的put操作引起死循環

死循環會導致程序假死,不是真正的死鎖,但某個線程對CPU消耗過多,導致其他線程等待CPU,內存等資源就也會陷入死鎖等待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章