演示死鎖並排查問題

2021-09-24 10:08:43 字數 1538 閱讀 4001

由於資源競爭或通訊問題造成的乙個阻塞現象,若無外力作用無法推進下去.

當執行緒互相持有對方所需要的資源時,會互相等待對方釋放資源,如果執行緒都不主動釋放所占有的資源,將產生死鎖。

1 < 競爭資源 < 搶占資源的執行緒數

如果競爭資源為1時,不存在死鎖問題,因為不是不是a執行緒占有就是b執行緒占有,不會相互等待對方釋放

import com.enjoy.demo.p1.ch1.class1.sleeptools;

/** * @author: billyu

* @description:演示普通的死鎖和解決

* @date: created in 13:29 2019-03-15.

* ** 死鎖:由於資源競爭或通訊問題造成的乙個阻塞現象,若無外力作用無法推進下去

* 1 < 競爭資源 < 搶占資源的執行緒數

* */

public class normaldeadlock }}

/*** 先拿第二個鎖,再拿第乙個鎖

*/private static void secondtofirst() throws interruptedexception}}

/*** 執行先拿第二個鎖,再拿第乙個鎖

*/private static class testthread extends thread

@override

public void run()catch (interruptedexception e)}}

public static void main(string args) catch (interruptedexception e)}}

控制台輸出:

subtestthread get second

testdeadlock get first

通過jps查詢應用的id,再通過jstack id檢視應用的鎖的持有情況(持有的鎖 等待的鎖)。

1.保證加鎖的順序

比如物件的hashcode,可以使用system.identityhashcode() 系統提供的native方法,兩個物件identityhashcode相同的概率只有千萬分之一。如果物件的identityhashcode相同,可以再在外面加乙個總的鎖,如果不同就以identityhashcode從小到大獲取鎖的順序進行。

2.reentrantlock

嘗試獲取鎖,直到獲取到所有的鎖為止,有鎖競爭時釋放鎖。

可能會導致活鎖的情況。可休眠隨機時長,避免活鎖的發生。

嘗試拿鎖的機制中,發生多個執行緒之間相互謙讓,不斷發生拿鎖,釋放鎖的過程。

解決辦法:每個執行緒休眠隨機時長,錯開拿鎖的時間

日誌排查問題總結

寫在前面 因為公司負責的專案流程鏈路很長,經常需要排查問題定位問題。目前專案是把每個service的方法前後都加上了入參和返回值的列印。接管專案後,總結了一下通過日誌定位問題的經驗,希望以後排查問題能有一些幫助。第二版 運單後台排查問題的方法總結 邏輯熟悉時 4.再根據測試 現場人員描述的描述以及自...

排查問題思路(一)

問題前提 今天回歸測試用例時,上午回歸用例正常,下午回歸用例98 的用例均報錯,返回空指標異常,伺服器執行正常未宕機。排查思路 1.重跑用例,檢視日誌,因為是錄製的流量,很多資料都是自動mock了,所以無法排查鏈路上是否存在問題。2.重跑全鏈路用例,發現服務基本正常,無問題,排除鏈路上的問題,問題可...

linux定時任務排查問題

閱讀本文時,請先閱讀 定時任務的配置 場景使用 當乙個處理需要定時任務處理時,但是卻沒有達到預期的效果的時候,可以這樣排查是否是定時任務出問題了!原則 無論是什麼,凡是涉及服務的必須有日誌!1.使用ssh等工具連上linux伺服器,使用命令檢視linux的定時任務是否正常執行 如果不正常執行手動呼叫...