package com.webgame.game.job; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; /** * 死锁检测 * Date: 2019/7/30. * Author:chongxin */ public class DeadlockCheck { private static final ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); public static void checkForDeadlocks() { long[] ids = findDeadlockedThreads(); if (ids != null && ids.length > 0) { ThreadInfo[] threadInfo = mbean.getThreadInfo(ids, true, true); for (ThreadInfo info : threadInfo) { System.out.println(info); } } } private static long[] findDeadlockedThreads() { if (mbean.isSynchronizerUsageSupported()) { return mbean.findDeadlockedThreads(); } else { return mbean.findMonitorDeadlockedThreads(); } } } 复制代码
package com.webgame.game.job; import java.util.Timer; import java.util.TimerTask; public class DeadLockDemo extends Thread { private static Object obj1 = new Object(); private static Object obj2 = new Object(); private boolean flag; public DeadLockDemo(boolean flag){ this.flag = flag; } @Override public void run(){ System.out.println(Thread.currentThread().getName() + "运行"); if(flag){ synchronized(obj1){ System.out.println(Thread.currentThread().getName() + "已经锁住obj1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(obj2){ // 执行不到这里 System.out.println("1秒钟后,"+Thread.currentThread().getName() + "锁住obj2"); } } }else{ synchronized(obj2){ System.out.println(Thread.currentThread().getName() + "已经锁住obj2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(obj1){ // 执行不到这里 System.out.println("1秒钟后,"+Thread.currentThread().getName() + "锁住obj1"); } } } } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new DeadLockDemo(true), "线程1"); Thread t2 = new Thread(new DeadLockDemo(false), "线程2"); Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { DeadlockCheck.checkForDeadlocks(); } }, 2000 , 1000); t1.start(); t2.start(); } } 复制代码