Java死锁检测

ThreadMXBean

常用方法:

  /** ThreadMXBean常用方法test */
        ThreadMXBean threadMXBean= ManagementFactory.getThreadMXBean();
        int count=threadMXBean.getThreadCount();//获取当前线程数目
        System.out.println("当前线程数为:"+count);
        long[]  threadIds=threadMXBean.getAllThreadIds();
        System.out.println("当前线程id们为:"+ JSONObject.toJSONString(threadIds));
        ThreadInfo[] threadInfos=threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds());
        System.out.println("当前线程的信息:"+JSONObject.toJSONString(threadInfos));
        System.out.println("是否支持测量线程执行时间:"+threadMXBean.isCurrentThreadCpuTimeSupported());
/**
 * 死锁检测工具
 * Created by liuhuichao on 2017/6/21.
 */
public class DeadLockCheckChecker {

    private  final static ThreadMXBean mbean=ManagementFactory.getThreadMXBean();
    final static Runnable deadLockCheck=new Runnable() {
        @Override
        public void run() {
            while (true){
                long[] deadLockedThreadIds=mbean.findDeadlockedThreads();
                if(deadLockedThreadIds!=null){
                    ThreadInfo[] threadInfos=mbean.getThreadInfo(deadLockedThreadIds);
                    for(Thread t: Thread.getAllStackTraces().keySet()){
                        for(int i=0;i<threadInfos.length;i++){
                            if(t.getId()==threadInfos[i].getThreadId()){
                                t.interrupt();
                            }
                        }
                    }
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
            }

        }
    };

    public static void check(){
        Thread thread=new Thread(deadLockCheck);
        thread.setDaemon(true);
        thread.start();
    }

}

可中断性测试:

/**ReentrantLock可中断性测试
 * Created by liuhuichao on 2017/6/20.
 */
public class ReentrantLockInterruptedTest implements Runnable {

    public static ReentrantLock lock1=new ReentrantLock();
    public static ReentrantLock lock2=new ReentrantLock();
    int lock;

    /**
     * 控制加锁顺序,方便构造死锁
     * @param lock
     */
    public ReentrantLockInterruptedTest(int lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        try{
            if(lock==1){
                lock1.lockInterruptibly();
                try{
                    Thread.sleep(500);
                }catch (InterruptedException e){}
                lock2.lockInterruptibly();
            }else{
                lock2.lockInterruptibly();
                try{
                    Thread.sleep(500);
                }catch (InterruptedException e){}
                lock1.lockInterruptibly();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            if(lock1.isHeldByCurrentThread()){
                lock1.unlock();
            }
            if(lock2.isHeldByCurrentThread()){
                lock2.unlock();
            }
            System.out.println("线程退出:"+Thread.currentThread().getId());
        }

    }

    public static void main(String[] args)  throws Exception{
        ReentrantLockInterruptedTest l1=new ReentrantLockInterruptedTest(1);
        ReentrantLockInterruptedTest l2=new ReentrantLockInterruptedTest(2);
        Thread t1=new Thread(l1);
        Thread t2=new Thread(l2);
        t1.start();
        t2.start();
        Thread.sleep(1000);
       DeadLockCheckChecker.check();

    }
}
时间: 2017-06-28

Java死锁检测的相关文章

通过Health Center API向死锁检测应用程序添加方法分析视图

Health Center 是一款适用于 Java 的 IBM监视和诊断工具,是一个免费的低开销诊断工具和 API,用于监视在 IBM Java 虚拟机 (JVM) 上运行的应用程序.有关此 API 可以执行的操作的细节,请参阅 第 1 部分.在本文中,将会采用 第 1 部分中开发的死锁检测应用程序,并添加一个方法分析视图来显示应用程序的哪些地方花费了大部分的 CPU 周期.(请 参阅 下载,以便获得示例的完整源代码.) 系统要求 Health Center API bundle 至少需要安装

线程-Mina框架死锁检测算法的原理?

问题描述 Mina框架死锁检测算法的原理? 30C private void checkDeadLock() { if (!(this instanceof CloseFuture || this instanceof WriteFuture || this instanceof ReadFuture || this instanceof ConnectFuture)) { return; } StackTraceElement[] stackTrace = Thread.currentThre

MySQL · 引擎新特性 · 可开关的InnoDB死锁检测

在数据库系统中,死锁问题几乎是不可避免的,一般要么是资源互相占用导致,或者是系统内部的锁升级(在innodb内尤其普遍),尤其是糟糕的未经审查的SQL设计通常是导致死锁的元凶.在MySQL InnoDB引擎中,死锁的检测是通过深度遍历进行的,每一个需要等待的行锁请求都需要去检测是否可能产生死锁. 关于InnoDB事务锁,可以参阅我之前的一篇博客,这里不展开讨论:MySQL · 引擎特性 · InnoDB 事务锁简介 死锁检测是一个成熟的数据库系统必不可少的功能,但是!如果我们的应用SQL经过了充

操作系统教程-死锁检测算法/分配资源给进程

问题描述 死锁检测算法/分配资源给进程 把死锁检测算法用于下面的数据 若第五个进程提出资源请求request5 (0,0,1,0), 为什么系统不能分配资源给它? 解决方案 针对进程快照的死锁检测算法---------------------- 解决方案二: 银行家算法? 你给的问题有点模糊,搞不懂里面的数据.

MySQL死锁检测简介

对于死锁,MySQL并没有提供提供直接的变量来表示.对于5.5版本之后的performance_shcema可以提供锁的详细信息(但我们还是5.0呢),对于InnoDB自带的监控器 Innodb_lock_monitor 其输出总是输出到错误日志中,不方便进行对比. 我监控采用的是zabbix,采用agent 被动方式向zabbix server传送数据.脚本为shell,采用show innodb status 重定向 核心代码: 检测是否为新的死锁信息:   New_deadlock() {

Linux内核调试技术——进程D状态死锁检测

Linux的进程存在多种状态,如TASK_RUNNING的运行态.EXIT_DEAD的停止态和TASK_INTERRUPTIBLE的接收信号的等待状态等等(可在include/linux/sched.h中查看).其中有一种状态等待为TASK_UNINTERRUPTIBLE,称为D状态,该种状态下进程不接收信号,只能通过wake_up唤醒.处于这种状态的情况有很多,例如mutex锁就可能会设置进程于该状态,有时候进程在等待某种IO资源就绪时(wait_event机制)会设置进程进入该状态.一般情况

UNIX环境高级编程:记录上锁(fcntl函数)以及死锁检测

一.记录锁 record locking 功能:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区. 字节范围锁 byte-range locking 二.历史 flock函数,可以锁整个文件,不能锁文件中的一部分. fcntl函数,增加了记录锁的功能. lockf函数,在fcntl基础上构造了lockf函数,提供一个简化的接口.可以锁文件中任意字节数的区域 三.fcntl 记录锁 函数原型: int fcntl(int fd, int cmd, struct flock

使用OptimizeIT进行Java内存泄露的检测

java程序也会引起内存泄露已经是公开的秘密了,工作中需要对该问题引起充分的重视. 市场上能够进行java内存检测的工具也有不少,我在工作中使用JBuilder自带的Optimize工具,现就最近一次使用Optimize的工程及经验进行以下梳理. 前一段时间根据需要,对工作中维护的某个模块进行了java内存泄露的测试,结果发现了很严重的问题:该模块一共有6大基本功能,每个功能每操作一次,大约要新消耗9-10k的内存空间,生成110个左右的新对象.作为商用软件产品是绝不允许这样的问题的出现的. O

IBM的Java诊断,第1部分

介绍面向 Java 的 IBM 转储分析器(IBM Dump Analyzer) 简介:Java 应用程序已经变得越来越复杂:因此,对这些应用程序进行问题诊断变得不再轻 松,并且可能需要某个外部服务组织做大量的工作.若能够指明正确的方向将节省时间和费用.IBM Dump Analyzer for Java 工具可以对格式化的系统转储做基本分析并生成简明的报告,指导您如何进行下一步 操作. Java 语言已经成为软件开发中的主导语言,因此, Java 虚拟机(VM)的稳定性成为一个 非常重要的问题

白话阿里巴巴Java开发手册(编程规约)

最近,阿里巴巴发布了<阿里巴巴Java开发手册>,总结了阿里人多年一线实战中积累的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过限制开发人员的编程风格.实现方式来避免研发人员在实践中容易犯的错误,同样的问题大家使用同样的模式解决,便于后期维护和扩展,确保最终在大规模协作的项目中达成既定目标. 无独有偶,笔者去年在公司里负责升级和制定研发流程.设计模板.设计标准.代码标准等规范,并在实际工作中进行了应用和推广,收效颇丰,也总结了适合支付平台的技术规范,由于阿里巴巴Java