那我們怎么確定一定是死鎖呢?有兩種方法。
1>使用JDK給我們的的工具JConsole,可以通過打開cmd然后輸入jconsole打開。
1)連接到需要查看的進程。
2)打開線程選項卡,然后點擊左下角的“檢測死鎖”
3)jconsole就會給我們檢測出該線程中造成死鎖的線程,點擊選中即可查看詳情:
從上圖中我們可以看出:
①在線程Thread-1中,從狀態可以看出,它想申請Paper這個資源,但是這個資源已經被Thread-0擁有了,所以就堵塞了。
②在線程Thread-0中,從狀態可以看出,它想申請Pen這個資源,但是這個資源已經被Thread-1擁有了,所以就堵塞了。
Thread-1一直等待paper資源,而Thread--一直等待pen資源,於是這兩個線程就這么僵持了下去,造成了死鎖。
2>直接使用JVM自帶的命令
1)首先通過 jps 命令查看需要查看的Java進程的vmid,如圖,我們要查看的進程TestDeadLock的vmid號是7412;
2)然后利用 jstack 查看該進程中的堆棧情況,在cmd中輸入 jstack -l 7412 ,移動到輸出的信息的最下面即可得到:
至此,相信大家都會看了吧,具體就不說啦,根據輸出,找到問題所在的代碼,開始調試解決即可啦。