(1),
public class TestCls {
private static Object lock1 = new Object();
private static Object lock2 = new Object();
public static void main(String[] args) throws Exception {
Thread th1 = new Thread(
new Runnable() {
@Override
public void run() {
synchronized (lock1 ) {
System.out.println("线程1锁住了成员静态变量lock1,阻塞线程3秒");
try {
Thread.sleep(3000);
} catch (Exception ex1) {
ex1.printStackTrace();
}
synchronized (lock2) {
System.out.println("线程1锁住了成员静态变量lock2");
}
}
}
}, "线程1"
);
th1.start();
Thread th2 = new Thread(
new Runnable() {
@Override
public void run() {
try {
synchronized (lock2){
System.out.println("线程2锁住了lock2,阻塞当前线程3秒");
Thread.sleep(3000);
synchronized (lock1) {
System.out.println("线程2锁住了lock1");
}
}
} catch (Exception ex1){
ex1.printStackTrace();
}
}
}, "线程2"
);
th2.start();
}
}(2),在cmd命令窗口
在cmd 中 jps -l 主类全名,进程号
jstack -l 进程号, 线程快照
如下
Found one java - level deadLock
线程2 waitting to lock monitor 0x00000583 (object 0x0000
线程1 waitting to lock monitor 0x00000583 (object 0x0000
Java多线程死锁示例及诊断,
该Java程序展示了两个线程分别获取不同锁然后尝试获取对方锁导致的死锁情况。线程1先锁定lock1,然后尝试lock2;线程2则相反,先锁定lock2再尝试lock1。通过`jps`和`jstack`命令,检测到一个Java级别的死锁,线程2等待lock1,而线程1等待lock2。
1031

被折叠的 条评论
为什么被折叠?



