JDK中ThreadDump诊断Java代码中的线程死锁问题

多线程的死锁..死锁不是死了而是线程互相等待...

在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题.

JavaJDK为我们提供了一个诊断工具叫做ThreadDump

想当于在某个时刻,给所有的Java线程照了一张照片,这个照片是一个文本信息.我们可以分析这个文本信息,找到死锁...

这个工具不用单独的安装,装好了JDK这个工具就有了.

要得到这个ThreadDump信息,Windows和Linux上有点不太一样...

windows上是按ctrl+break

linux上是kill -3 pid

 

示例死锁代码DeadLock.java:

 1 public class DeadLock {
 2 
 3     final Object lockA = new Object();
 4     final Object lockB = new Object();
 5     
 6     public static void main(String[] args) {
 7         DeadLock demo = new DeadLock();
 8         demo.startLock();
 9     }
10     
11     public void startLock(){
12         ThreadA a= new ThreadA(lockA,lockB);
13         ThreadB b= new ThreadB(lockA,lockB);
14         
15         //start threads
16         a.start();
17         b.start();
18     }
19 
20 }
21 
22 class ThreadA extends Thread{
23 
24     private Object lockA = null;
25     private Object lockB = null;
26     
27     public ThreadA(Object a, Object b){
28         this.lockA = a;
29         this.lockB = b;
30     }
31 
32     public void run() {
33         synchronized (lockA) {
34             System.out.println("*** Thread A: ***: Lock A" );
35             try {
36                 sleep(3000);
37             } catch (InterruptedException e) {
38                 e.printStackTrace();
39             }
40             synchronized (lockB) {
41                 System.out.println("*** Thread A: ***: Lock B" );
42             }
43         }
44         
45         System.out.println("*** Thread A: ***: Finished" );
46     }
47     
48 }
49 
50 class ThreadB extends Thread{
51 
52     private Object lockA = null;
53     private Object lockB = null;
54     
55     public ThreadB(Object a, Object b){
56         this.lockA = a;
57         this.lockB = b;
58     }
59     public void run() {
60         synchronized (lockB) {
61             System.out.println("*** Thread B: ***: Lock B" );
62             try {
63                 sleep(3000);
64             } catch (InterruptedException e) {
65                 e.printStackTrace();
66             }
67             synchronized (lockA) {
68                 System.out.println("*** Thread B: ***: Lock A" );
69             }
70         }    
71         
72         System.out.println("*** Thread B: ***: Finished" );
73     }
74     
75 }

在命令行上运行:

通过ThreadDump来找到死锁的地方. 在windows上按ctrl+break...

 

 下面是死锁的相关信息,说出了原因,定位到了具体的某一行..这个信息非常有用...

 

posted @ 2016-12-31 12:23  SummerChill  阅读(621)  评论(0编辑  收藏  举报