Java检测死锁案例
导致死锁的程序
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; }@Overridepublic 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.使用尝试获取锁的方法,如果无法获取,就将本身已经获取到的锁释放,类似破坏不可剥夺条件。
银行家算法属于检测是不是会存在死锁,这种做法实际上也是破坏环路等待条件的发生。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用
- Java基础-高级特性-枚举实现状态机