测试线程死锁,运行以下代码:
public class Test1 {
private static Object o1 = new Object();
private static Object o2 = new Object();
public static void main(String[] args) {
for( int i = 0;i<100;i++){
new Thread(new Runnable() {
@Override
public void run() {
synchronized (o1) {
synchronized (o2) {
System.out.println("am o1");
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (o2) {
synchronized (o1) {
System.out.println("am o2");
}
}
}
}).start();
}
}
}
代码中线程1先申请obj1,再申请obj2;线程2先申请obj2,再申请obj1。如果执行次数多了就会出现死锁,我们依然来看线程的监控台:
在jdk中 C:\Program Files\Java\jdk1.8.0_101\bin目录下有jvisualvm.exe工具
运行以上代码 查看线程,如下图所示:
选择一个线程进行dump查看;可以查看出死锁的具体原因,可利用此工具查看程序中那些线程死锁,从而更好的排查错误。