多线程的死锁..死锁不是死了而是线程互相等待…
在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题.
JavaJDK为我们提供了一个诊断工具叫做ThreadDump
想当于在某个时刻,给所有的Java线程照了一张照片,这个照片是一个文本信息.我们可以分析这个文本信息,找到死锁…
这个工具不用单独的安装,装好了JDK这个工具就有了.
要得到这个ThreadDump信息,Windows和Linux上有点不太一样…
windows上是按ctrl+break
linux上是kill -3 pid
示例死锁代码DeadLock.java:
1 public class DeadLock { 2 3 final Object lockA = new Object(); 4 final Object lockB = new Object(); 5 6 public static void main(String[] args) { 7 DeadLock demo = new DeadLock(); 8 demo.startLock(); 9 } 10 11 public void startLock(){ 12 ThreadA a= new ThreadA(lockA,lockB); 13 ThreadB b= new ThreadB(lockA,lockB); 14 15 //start threads 16 a.start(); 17 b.start(); 18 } 19 20 } 21 22 class ThreadA extends Thread{ 23 24 private Object lockA = null; 25 private Object lockB = null; 26 27 public ThreadA(Object a, Object b){ 28 this.lockA = a; 29 this.lockB = b; 30 } 31 32 public void run() { 33 synchronized (lockA) { 34 System.out.println("*** Thread A: ***: Lock A" ); 35 try { 36 sleep(3000); 37 } catch (InterruptedException e) { 38 e.printStackTrace(); 39 } 40 synchronized (lockB) { 41 System.out.println("*** Thread A: ***: Lock B" ); 42 } 43 } 44 45 System.out.println("*** Thread A: ***: Finished" ); 46 } 47 48 } 49 50 class ThreadB extends Thread{ 51 52 private Object lockA = null; 53 private Object lockB = null; 54 55 public ThreadB(Object a, Object b){ 56 this.lockA = a; 57 this.lockB = b; 58 } 59 public void run() { 60 synchronized (lockB) { 61 System.out.println("*** Thread B: ***: Lock B" ); 62 try { 63 sleep(3000); 64 } catch (InterruptedException e) { 65 e.printStackTrace(); 66 } 67 synchronized (lockA) { 68 System.out.println("*** Thread B: ***: Lock A" ); 69 } 70 } 71 72 System.out.println("*** Thread B: ***: Finished" ); 73 } 74 75 }
在命令行上运行:
通过ThreadDump来找到死锁的地方. 在windows上按ctrl+break…
下面是死锁的相关信息,说出了原因,定位到了具体的某一行..这个信息非常有用…