1. 程式人生 > >死鎖排查的小竅門 --使用jdk自帶管理工具jstack

死鎖排查的小竅門 --使用jdk自帶管理工具jstack

pre ble new deadlock 一段 指令 tro bject print

本文版權歸 遠方的風lyh和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作。

開發時間久了,難免會寫出一些一些死鎖的代碼,自己明明調用該方法可該方法就是不執行、不進該方法、日誌也不打印!

這裏我們模擬一段死鎖的代碼,使用jdk自帶的管理工具來排查是不是死鎖了!

 1 //思索代碼
 2 public class DeadLockDemo  implements Runnable{
 3 
 4         public int flag = 1;
 5         //靜態對象是類的所有對象共享的
 6         private static Object o1 = new
Object(), o2 = new Object(); 7 @Override 8 public void run() { 9 System.out.println("flag=" + flag); 10 if (flag == 1) { 11 synchronized (o1) { 12 try { 13 Thread.sleep(500); 14 15 } catch
(Exception e) { 16 e.printStackTrace(); 17 } 18 synchronized (o2) { 19 System.out.println("1"); 20 } 21 } 22 } 23 if (flag == 0) { 24 synchronized
(o2) { 25 try { 26 Thread.sleep(500); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 synchronized (o1) { 31 System.out.println("0"); 32 } 33 } 34 } 35 } 36 37 public static void main(String[] args) { 38 39 DeadLockDemo td1 = new DeadLockDemo(); 40 DeadLockDemo td2 = new DeadLockDemo(); 41 td1.flag = 1; 42 td2.flag = 0; 43 //td1,td2都處於可執行狀態,但JVM線程調度先執行哪個線程是不確定的。 44 //td2的run()可能在td1的run()之前運行 45 new Thread(td1).start(); 46 new Thread(td2).start(); 47 48 } 49 }

啟動該段代碼,執行之後一直卡著

技術分享

接下來我們在終端使用指令 jps查詢該類的端口號為7824

技術分享

再使用 jstack 端口號

jstack 7824

技術分享

可以發現該段程序死鎖!

死鎖排查的小竅門 --使用jdk自帶管理工具jstack