Java死锁检测

简介: ThreadMXBean常用方法: /** ThreadMXBean常用方法test */ ThreadMXBean threadMXBean= ManagementFactory.

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();

    }
}
目录
相关文章
|
1月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
52 6
|
2月前
|
安全 Java Python
基于python-django的Java网站全站漏洞检测系统
基于python-django的Java网站全站漏洞检测系统
39 0
|
4月前
|
监控 算法 安全
Java并发编程案例分析:死锁的检测与解决
Java并发编程案例分析:死锁的检测与解决
43 2
|
4月前
|
Java
如何避免 Java 中的死锁?
【8月更文挑战第22天】
42 4
|
4月前
|
网络协议 Java
JAVA实现心跳检测【长连接】
这篇文章介绍了Java中实现心跳检测机制的方法,包括心跳机制的简介、实现方式、客户端和服务端的代码实现,以及具体的测试结果。文中详细阐述了如何通过自定义心跳包和超时检测来维持长连接,并提供了完整的客户端和服务端示例代码。
JAVA实现心跳检测【长连接】
|
4月前
|
存储 SQL 关系型数据库
深入MySQL锁机制:原理、死锁解决及Java防范技巧
深入MySQL锁机制:原理、死锁解决及Java防范技巧
|
4月前
|
安全 算法 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(下)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
87 6
|
4月前
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(中)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
94 5
|
4月前
|
存储 安全 Java
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)(上)
17 Java多线程(线程创建+线程状态+线程安全+死锁+线程池+Lock接口+线程安全集合)
91 3
|
4月前
|
Java
Java多线程-死锁的出现和解决
死锁是指多线程程序中,两个或以上的线程在运行时因争夺资源而造成的一种僵局。每个线程都在等待其中一个线程释放资源,但由于所有线程都被阻塞,故无法继续执行,导致程序停滞。例如,两个线程各持有一把钥匙(资源),却都需要对方的钥匙才能继续,结果双方都无法前进。这种情况常因不当使用`synchronized`关键字引起,该关键字用于同步线程对特定对象的访问,确保同一时刻只有一个线程可执行特定代码块。要避免死锁,需确保不同时满足互斥、不剥夺、请求保持及循环等待四个条件。