导致死锁的程序
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.使用尝试获取锁的方法,如果无法获取,就将本身已经获取到的锁释放,类似破坏不可剥夺条件。 银行家算法属于检测是不是会存在死锁,这种做法实际上也是破坏环路等待条件的发生。