zoukankan      html  css  js  c++  java
  • JDK中ThreadDump诊断Java代码中的线程死锁问题

    多线程的死锁..死锁不是死了而是线程互相等待...

    在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题.

    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...

     

     下面是死锁的相关信息,说出了原因,定位到了具体的某一行..这个信息非常有用...

  • 相关阅读:
    java wait 与 notify sleep
    java线程安全总结
    ubuntu安装遇到的问题
    python时间处理函数
    js获取当前时间
    sql如何将同个字段不同值打印在一行
    django models数据类型
    django上传图片和文字记录
    django form使用学习记录
    django中request对象详解(转载)
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6239030.html
Copyright © 2011-2022 走看看