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

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

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

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

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

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

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

windows上是按ctrl+break

linux上是kill -3 pid

示例死锁代码DeadLock.java:

 public class DeadLock {

     final Object lockA = new Object();
final Object lockB = new Object(); public static void main(String[] args) {
DeadLock demo = new DeadLock();
demo.startLock();
} public void startLock(){
ThreadA a= new ThreadA(lockA,lockB);
ThreadB b= new ThreadB(lockA,lockB); //start threads
a.start();
b.start();
} } class ThreadA extends Thread{ private Object lockA = null;
private Object lockB = null; public ThreadA(Object a, Object b){
this.lockA = a;
this.lockB = b;
} public void run() {
synchronized (lockA) {
System.out.println("*** Thread A: ***: Lock A" );
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println("*** Thread A: ***: Lock B" );
}
} System.out.println("*** Thread A: ***: Finished" );
} } class ThreadB extends Thread{ private Object lockA = null;
private Object lockB = null; public ThreadB(Object a, Object b){
this.lockA = a;
this.lockB = b;
}
public void run() {
synchronized (lockB) {
System.out.println("*** Thread B: ***: Lock B" );
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA) {
System.out.println("*** Thread B: ***: Lock A" );
}
} System.out.println("*** Thread B: ***: Finished" );
} }

在命令行上运行:

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

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

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

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

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

上一篇:Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)


下一篇:Tomcat服务的安装及配置