死锁实战(通过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处理订单超时取消