java死锁检测

tech2023-02-28  108

导致死锁的程序

package com.study.train; import java.io.IOException; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.FutureTask; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import static java.lang.Thread.yield; public class Main extends Thread{ private Object o1; private Object o2; Main(Object oa,Object ob,String name) { super(name); o1 = oa; o2 = ob; } @Override public void run() { synchronized (o1) { System.out.println("thread: "+Thread.currentThread().getName() + " get lock"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o2) { System.out.println("two lock is get"); } } } public static void main(String[] args) throws InterruptedException { Object oj1 = new Object(); Object oj2 = new Object(); Main m1 = new Main(oj1,oj2,"thread1"); Main m2 = new Main(oj2,oj1,"thread2"); m1.start(); m2.start(); m1.join(); m2.join(); } }

1.jconsole工具检测

2. jsp+jstack

linux上可以先使用top | grep java,查找忙的线程pid,然后拿到该线程id进行分析,jstakc pid。

避免死锁的方法

1.尽量避免使用多个锁2.如果一定要使用多个锁,可以考虑顺序获取锁,这样就类似破坏了环路等待条件3.使用尝试获取锁的方法,如果无法获取,就将本身已经获取到的锁释放,类似破坏不可剥夺条件。 银行家算法属于检测是不是会存在死锁,这种做法实际上也是破坏环路等待条件的发生。
最新回复(0)