zoukankan      html  css  js  c++  java
  • [转]Java死锁排查

    文章来源:微信公众号:猿天地  

    1. 死锁的概念:

      是Java多线程情况下,两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都讲无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在相互等待的进程成为死锁进程。

    2. 出现死锁的条件:

     (1)必须是两个或者两个以上进程(线程)

     (2)必须有竞争资源

    3. 如果排查代码中出现了死锁?

     死锁代码:

    public class JStackDemo {
    
        public static void main(String[] args) {
            Thread t1 = new Thread(new DeadLockTest(true));
            Thread t2 = new Thread(new DeadLockTest(false));
            t1.setName("thread-test-1");
            t2.setName("thread-test-2");
            t1.start();
            t2.start();
        }
    
    }
    
    class DeadLockTest implements Runnable {
    
        public boolean flag; //控制线程
    
        DeadLockTest(boolean flag) {
            this.flag = flag;
        }
    
        @Override
        public void run() {
            // 如果flag的值为true则调用t1线程
            if(flag){
                while (true){
                    synchronized (Demo.o1) {
                        System.out.println("o1" + Thread.currentThread().getName());
                        synchronized (Demo.o2) {
                            System.out.println("o2" + Thread.currentThread().getName());
                        }
                    }
                }
            } else {
                // 如果flag的值为false则调用t2线程
                while (true) {
                    synchronized (Demo.o2) {
                        System.out.println("o2" + Thread.currentThread().getName());
                        synchronized (Demo.o1) {
                            System.out.println("o2" + Thread.currentThread().getName());
                        }
                    }
                }
            }
        }
    }
    
    class Demo {
        static Object o1 = new Object();
        static Object o2 = new Object();
    }

    方法一:使用jps + jstack

     1. 在windows命令窗口,使用 jps -l  查看当前的java进程的pid,通过包路径很容易区分出自己开发的程序进程。 

     2. 使用 jstack -l 908 如果出现一下错误信息,说明是死锁线程

    方法二:使用jconsole

     在window打开JConsole,JConsole是一个图形化的监控工具。(本人没有试过)

     1. 在windows命令窗口,输出JConsole

     2. 选择到线程的tab页上, 查看线程状态

    方法三:使用Java Visual VM

     在window打开 jvisualvm,jvisualvm是一个图形化的监控工具!

     下载地址:https://visualvm.github.io

     1. 在windows命令窗口,输出 jvisualvm ,会弹出Java VisualVM窗口

     

     2. 点击程序要查看的程序线程,选择 “线程” tab页,发现 “监视” 的红颜色线程,就是死锁的。点击右侧 “线程Dump” 可以查看具体错误信息。

  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    node 封装db层
    json结构更改的方法 把date有数据的分类
    webpack.config.js
    SQLSERVER 跨服 跨库
    sqlserver2005重新安装(安装汇编错误,安装程序无法连接到数据库服务进行服务配置)
    delete语句与reference约束 FK_subplan_job_id冲突问题,导致job无法删除解决办法
    删除作业计划出错(DELETE语句与 REFERENCE约束"FK_subplan_job_id"冲突。)
    jquery判断checked的三种方法
    SQLSERVER和sybase的差异
  • 原文地址:https://www.cnblogs.com/huanshilang/p/11285782.html
Copyright © 2011-2022 走看看