死锁实战(通过jps、jstack查看运行信息)
我们先来创造一个死锁的情况,代码如下:
public class DeadLockDemo {
static Object resource1 = new Object();
static Object resource2 = new Object();
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
synchronized (resource1) {
try {
System.out.println(Thread.currentThread() + "get resource1");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "ready to get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}).start();
new Thread(()->{
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "ready to get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
}
}
}).start();
Thread.sleep(2000);
}
}
当程序运行之后,程序会卡住,两个线程相互争夺资源造成死锁: 输出如下:
Thread[Thread-0,5,main]get resource1 Thread[Thread-1,5,main]get resource2 Thread[Thread-0,5,main]ready to get resource2 Thread[Thread-1,5,main]ready to get resource1
我们打开shell,键入
C:UsersAdministrator>jps 1096 12252 DeadLockDemo 13964 Jps 6604 Launcher
可以发现正在运行中的DeadLockDemo的pid为12252 我们继续键入:
C:UsersAdministrator>jstack 12252
2021-03-22 23:49:15
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.261-b12 mixed mode):
"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x000001ffd2196000 nid=0x1bec waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Thread-1" #13 prio=5 os_prio=0 tid=0x000001ffd2197000 nid=0x2f30 waiting for monitor entry [0x000000b42ecff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at DeadLockDemo.lambda$main$1(DeadLockDemo.java:34)
- waiting to lock <0x000000076b6b07f0> (a java.lang.Object)
- locked <0x000000076b6b0800> (a java.lang.Object)
at DeadLockDemo$$Lambda$2/2093631819.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Thread-0" #12 prio=5 os_prio=0 tid=0x000001ffd219c000 nid=0x92c waiting for monitor entry [0x000000b42ebff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at DeadLockDemo.lambda$main$0(DeadLockDemo.java:20)
- waiting to lock <0x000000076b6b0800> (a java.lang.Object)
- locked <0x000000076b6b07f0> (a java.lang.Object)
at DeadLockDemo$$Lambda$1/1023892928.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
redis处理订单超时取消
