package com.agileeagle.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.agileeagle.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();
}
}