A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 游灿平 中级黑马   /  2013-2-24 14:45  /  2009 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看到论坛中神贴也很多,我也来分享下我的经验,探讨多线程死锁使用ThreadDump查看死锁,这是本人的经验之谈,把技术放在硬盘里还不如拿出来共同研究,如果觉得有帮助就顶下!
在多线程程序中,线程死锁是一件很令人头疼的事情,有的时候程序挂了,不知道哪的bug,在多线程程序中如果能很快判断出线程死锁,就可以快速的修正bug。
  • 首先写个死锁
       线程死锁产生的原因是:锁嵌套,最简单的是A锁嵌套B锁,B锁嵌套A锁,所以尽量不要使用同步嵌套这样会很危险。
  1. public class TestDeadLock {

  2.         public static Object lockA = new Object();
  3.         public static Object lockB = new Object();
  4.        
  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 ThreadA a = new ThreadA();
  10.                 ThreadB b = new ThreadB();
  11.                
  12.                 a.start();
  13.                 b.start();

  14.         }

  15. }

  16. class ThreadA extends Thread{
  17.        
  18.         public void run(){
  19.                 System.out.println("** Enter ThreadA **");
  20.                 synchronized (TestDeadLock.lockA) {
  21.                         System.out.println("** Enter ThreadA **:  Lock A" );
  22.                         try {
  23.                                 Thread.sleep(2000);
  24.                         } catch (InterruptedException e) {
  25.                                 e.printStackTrace();
  26.                         }
  27.                        
  28.                         //attemp to lock B
  29.                         synchronized(TestDeadLock.lockB){
  30.                                 System.out.println("** Enter ThreadA **:  Lock B" );
  31.                         }
  32.                 }
  33.         }

  34. }


  35. class ThreadB extends Thread{
  36.        
  37.         public void run(){
  38.                 System.out.println("** Enter ThreadB **");
  39.                 synchronized (TestDeadLock.lockB) {
  40.                         System.out.println("** Enter ThreadB **:  Lock B" );
  41.                         try {
  42.                                 Thread.sleep(2000);
  43.                         } catch (InterruptedException e) {
  44.                                 e.printStackTrace();
  45.                         }
  46.                        
  47.                         //attemp to lock A
  48.                         synchronized(TestDeadLock.lockA){
  49.                                 System.out.println("** Enter ThreadA **:  Lock A" );
  50.                         }
  51.                 }
  52.         }
  53. }
复制代码
  • 编译查看出现的死锁
      
  • 接下来使用ThradDump判断死锁
         Windos:ctrl+break
      Linux :kill -3 pid(进程号)
   以下是windos下得输出结果
   TreadDump的作用
   1、通过TreadDump的输出信息可以判断死锁
   2、对java程序进行调优
      可以在一分钟内做 5~6次TreadDump
      如果一个线程一直都是RUNNABLE或者BLOCKED这个线程就有可能出现问题
      
      

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马