注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Big-Time的博客

天行健,君子以自强不行。

 
 
 

日志

 
 
关于我

人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定、冷静,学习如何从慌乱中找到生机。

网易考拉推荐

利用jstack检测死锁DeadLock  

2011-10-25 11:29:36|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

首先,制造一个死锁程序如下:

public class testJstack {
 final static Object obj_1 = new Object();
 final static Object obj_2 = new Object();
  public static void main(String[] args){
   
   Thread t1 = new Thread("t1"){
    public void run(){
     synchronized(obj_1){
      try{
       Thread.sleep(3000);
      }catch(InterruptedException e){}
      System.out.println("lock obj_1");
      synchronized(obj_2){
       System.out.println("thread t1 done.");
      }
     }
     
     
    }
   };
   
   Thread t2 = new Thread("t2"){
    public void run(){
     synchronized(obj_2){
      
      System.out.println("lock obj_2");
      synchronized(obj_1){
       System.out.println("thread t2 done.");
      }
      
     }
     
    }
   };
   t1.start();
   t2.start();
  }

在eclipse中执行之后,程序就会进入漫无休止的等待。这时,我们可以在linux命令行下,查看死锁的状态。

首先, 利用jps查看当前执行的java进程。如下:

jps
8759
9734 testJstack
9751 Jps

利用jstack命令如下:

jstack -l 9734 > deadlock.jstack

利用vim 打开deadlock.jstack文件,发现内容如下:

2011-04-28 21:42:40

   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

   java.lang.Thread.State: RUNNABLE


   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)


   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$1.run(testJstack.java:15)

   Locked ownable synchronizers:
        - None

   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
   java.lang.Thread.State: RUNNABLE
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - locked <0x8c050b30> (a java.lang.ref.ReferenceQueue$Lock)

   Locked ownable synchronizers:
        - None

        - waiting on <0x8c050a30> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        - locked <0x8c050a30> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
"VM Thread" prio=10 tid=0x0807e800 nid=0x260c runnable


JNI global references: 576


Found one Java-level deadlock:
=============================
"t2":
  which is held by "t1"
"t1":
  which is held by "t2"

Java stack information for the threads listed above:
===================================================
"t2":
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)
"t1":
        at testJstack$1.run(testJstack.java:15)
        - waiting to lock <0x8c087678> (a java.lang.Object)
        - locked <0x8c087670> (a java.lang.Object)

Found 1 deadlock.

如上,我们看到jstack确实检测到了一个死锁。

  评论这张
 
阅读(902)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017