1.jstack查找死锁原因(这个命令也可以查找程序的其他问题 比如内存泄漏问题)
通过jps获取程序pid
在通过 jstack pid 查看死锁具体原因
2.在程序里通过ThreadMXBean查找
public static void main(String[] args) throws InterruptedException {
test7 t = new test7();
test7 tt = new test7();
t.flag=1;
tt.flag=2;
Thread t1 = new Thread(t, "t1");
Thread t2 = new Thread(tt, "t2");
t1.start();
t2.start();
Thread.sleep(1000);
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
long[] deadlockedThreads = threadMXBean.findDeadlockedThreads();
if(deadlockedThreads!=null && deadlockedThreads.length>0){
for(int i=0;i<deadlockedThreads.length;i++){
ThreadInfo threadInfo = threadMXBean.getThreadInfo(deadlockedThreads[i]);
System.out.println("线程id为"+threadInfo.getThreadId()+",线程名"+threadInfo.getThreadName()
+"的线程已经发生了死锁,需要的锁正被线程"+threadInfo.getLockOwnerName()+"持有。");
}
}
}