多线程死锁分析

本文展示了如何在Java中编写代码来演示死锁情况,并通过使用VisualVM和jstack工具分析线程执行过程。重点介绍了死锁的概念、产生原因以及解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写下面代码,用于演示死锁情况:

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



如果在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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值