1编写死锁案列,运行
1package com.thread.thread.deadLock; 2 3 4public class DeadLockTest { 5 public static String objA = "strA"; 6 public static String objB = "strB"; 7 public static void main(String[] args){ 8 Thread a = new Thread(new Lock1()); 9 Thread b = new Thread(new Lock2()); 10 a.start(); 11 b.start(); 12 } 13} 14class Lock1 implements Runnable{ 15 @Override 16 public void run(){ 17 try{ 18 System.out.println("Lock1 running"); 19 while(true){ 20 synchronized(DeadLockTest.objA){ 21 System.out.println("Lock1 lock strA"); 22 Thread.sleep(3000);//获取strA后先等一会儿,让Lock2有足够的时间锁住strB 23 synchronized(DeadLockTest.objB){ 24 System.out.println("Lock1 lock strB"); 25 } 26 } 27 } 28 }catch(Exception e){ 29 e.printStackTrace(); 30 } 31 } 32} 33class Lock2 implements Runnable{ 34 @Override 35 public void run(){ 36 try{ 37 System.out.println("Lock2 running"); 38 while(true){ 39 synchronized(DeadLockTest.objB){ 40 System.out.println("Lock2 lock strB"); 41 Thread.sleep(3000); 42 synchronized(DeadLockTest.objA){ 43 System.out.println("Lock2 lock strA"); 44 } 45 } 46 } 47 }catch(Exception e){ 48 e.printStackTrace(); 49 } 50 } 51}
2 jps -v找到对应的线程 (对于安装了jvisualvm或者jconsole的也可以通过图形界面直接查看死锁的堆栈信息)

3jstack 7312 查看死锁的相关信息

可以看出thread-1锁住0x000000076f3b0308 等待0x000000076f3b02f0 与thread-0恰好相反