产生死锁的代码:
package neicun;
public class DeadLockTest {
static class SynAddRunnable implements Runnable {
private Object a, b;
public SynAddRunnable(Object a, Object b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
synchronized (a) {
try {
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (b) {
System.out.println(a.toString() + " " + b.toString());
}
}
}
}
public static void main(String[] args) {
String a = new String("a");
String b = new String("b");
new Thread(new SynAddRunnable(a, b)).start();
new Thread(new SynAddRunnable(b, a)).start();
}
}
打开jvisualvm,右击选中的java进程,选中->Trace application
在打开的窗口里面输入以下代码:
/* BTrace Script Template */
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TracingScript {
/* put your code here */
@OnTimer(4000)
public static void print(){
deadlocks();
}
}
上面代码的依旧就是每4秒钟检查以下死锁,dealdlocks方法是BTrace工具提供的静态方法,输出的结果如下:
从结果可知在代码22行处,因为Thread-0需要持有的锁已经被Thread-1所持有,而同样的Thread-1需要持有的锁已经被Thread-0锁持有。