首页 > 其他 > 详细

多线程死锁分析

时间:2014-02-26 04:19:26      阅读:318      评论:0      收藏:0      [点我收藏+]
编写下面代码,用于演示死锁情况:

public class ThreadDeadlock {
      public static void main(String[] args) throws InterruptedException {
            Object obj1 = new Object();
            Object obj2 = new Object();
            Object obj3 = new Object();
            
            Thread t1 = new Thread( new SyncThread(obj1, obj2), "t1");
        Thread t2 = new Thread( new SyncThread(obj2, obj3), "t2");
        Thread t3 = new Thread( new SyncThread(obj3, obj1), "t3");
 
        t1.start();
        Thread.sleep(5000);
        t2.start();
        Thread.sleep(5000);
        t3.start();
      }
}
class SyncThread implements Runnable {
      private Object obj1;
      private Object obj2;

      public SyncThread(Object obj1, Object obj2) {
             this. obj1 = obj1;
             this. obj2 = obj2;
      }
      @Override
      public void run() {
            String name = Thread. currentThread().getName();
            System. out.println(name + "申请锁:"+obj1 );
             synchronized ( obj1) {
                  System. out.println(name + "获取锁:"+obj1 );
                  work();
                  System. out.println(name + "申请锁:"+obj2 );
                   synchronized ( obj2) {
                        System. out.println(name + "获取锁:"+obj2 );
                        work();
                  }
                  System. out.println(name + "释放锁:"+obj2 );
            }
            System. out.println(name + "释放锁:"+obj1 );
            System. out.println(name + "运行结束");
      }
      
      private void work(){
             try {
                  Thread. sleep(30000);
            } catch (InterruptedException e) {
                  e.printStackTrace();
            }
      }
}

执行上面的程序时,就产生了输出,但是程序却因为死锁无法停止
t1申请锁:java.lang.Object@1d87b360
t1获取锁:java.lang.Object@1d87b360
t2申请锁:java.lang.Object@47bb2cb
t2获取锁:java.lang.Object@47bb2cb
t3申请锁:java.lang.Object@653e4653
t3获取锁:java.lang.Object@653e4653
t1申请锁:java.lang.Object@47bb2cb
t2申请锁:java.lang.Object@653e4653
t3申请锁:java.lang.Object@1d87b360

要分析线程执行情况,需要用工具 dump 线程信息。可以使用 VisualVM (http://visualvm.java.net/)
运行 VisualVM,直接右键就可以Dump
bubuko.com,布布扣
bubuko.com,布布扣

如果在linux 上 可以用jdk 提供 jstack 工具:
ps -eaf|grep java    找到PID
jstack 26444 >> ~/a.dump

参考文章:
http://www.importnew.com/9668.html
http://www.journaldev.com/1053/how-to-generate-thread-dump-in-java


多线程死锁分析

原文:http://blog.csdn.net/yanliang1/article/details/19905501

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!