首先,製造一個死鎖程序以下:java
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命令行下,查看死鎖的狀態。linux
首先, 利用jps查看當前執行的java進程。以下:vim
jpseclipse
8759 命令行
9734 testJstackcode
9751 Jpsorm
利用jstack命令以下:進程
jstack -l 9734 > deadlock.jstackip
利用vim 打開deadlock.jstack文件,發現內容以下:it
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確實檢測到了一個死鎖。