deadlock

deadlock

死锁:线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源,两个线程都无法继续执行。
活锁:线程持续重试一个总是失败的操作,导致无法继续执行
饿死:线程一直被调度器延迟访问其赖以执行的资源,也许是调度器先于低优先级的线程而执行高优先级的线程,同时总是会有一个高优先级
的线程可以执行,饿死也叫做无线延迟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class MyTest6 {
private Object lock1 = new Object();
private Object lock2 = new Object();
public void myMethod1() {
synchronized (lock1) {
synchronized (lock2) {
System.out.println("myMethod1 invoked");
}
}
}
public void myMethod2() {
synchronized (lock2) {
synchronized (lock1) {
System.out.println("myMethod2 invoked");
}
}
}
public static void main(String[] args) {
MyTest6 myTest6 = new MyTest6();
Runnable runnable1 = () ->{
while (true) {
myTest6.myMethod1();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread1 = new Thread(runnable1, "myThread1");
Runnable runnable2 = () ->{
while (true) {
myTest6.myMethod2();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread thread2 = new Thread(runnable2, "myThread2");
thread1.start();
thread2.start();
}
}

检测与相关工具

图形化工具

1
2
jvisualvm

concurrency-1

concurrency-2

命令行

1
jps
1
2
3
4
5
6
11872 Main
10980 Jps
11844 Launcher
3060
11212 MyTest6
1
jstack 11212
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
2019-12-12 14:44:39
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):
"DestroyJavaVM" #13 prio=5 os_prio=0 tid=0x00000000031d2800 nid=0x3624 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"myThread2" #12 prio=5 os_prio=0 tid=0x00000000194e3000 nid=0xd78 waiting for monitor entry [0x0000000019f9e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.bob.concurrency3.MyTest6.myMethod2(MyTest6.java:37)
- waiting to lock <0x00000000d5e9c078> (a java.lang.Object)
- locked <0x00000000d5e9c088> (a java.lang.Object)
at com.bob.concurrency3.MyTest6.lambda$main$1(MyTest6.java:62)
at com.bob.concurrency3.MyTest6$$Lambda$2/1096979270.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"myThread1" #11 prio=5 os_prio=0 tid=0x00000000194de000 nid=0x3174 waiting for monitor entry [0x0000000019e9f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.bob.concurrency3.MyTest6.myMethod1(MyTest6.java:27)
- waiting to lock <0x00000000d5e9c088> (a java.lang.Object)
- locked <0x00000000d5e9c078> (a java.lang.Object)
at com.bob.concurrency3.MyTest6.lambda$main$0(MyTest6.java:49)
at com.bob.concurrency3.MyTest6$$Lambda$1/1324119927.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"Service Thread" #10 daemon prio=9 os_prio=0 tid=0x00000000192bb000 nid=0x2cf4 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001924f000 nid=0x2fa0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x00000000191f5800 nid=0x3478 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x00000000191f2800 nid=0x3528 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x00000000191e6800 nid=0x3544 runnable [0x000000001989e000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
- locked <0x00000000d5f34298> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
- locked <0x00000000d5f34298> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000017e3e000 nid=0x3754 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x00000000191a8800 nid=0x10b8 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000017e1a800 nid=0x14cc in Object.wait() [0x000000001919f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d5d08ec8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x00000000d5d08ec8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000032c0800 nid=0x3030 in Object.wait() [0x000000001909f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d5d06b68> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x00000000d5d06b68> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
"VM Thread" os_prio=2 tid=0x0000000017df8000 nid=0x9f4 runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000031e7800 nid=0x37c8 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000031e9800 nid=0x2794 runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000000031eb000 nid=0x3024 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000000031ec800 nid=0x1154 runnable
"VM Periodic Task Thread" os_prio=2 tid=0x00000000192c6000 nid=0x3074 waiting on condition
JNI global references: 335
Found one Java-level deadlock:
=============================
"myThread2":
waiting to lock monitor 0x00000000032c8b58 (object 0x00000000d5e9c078, a java.lang.Object),
which is held by "myThread1"
"myThread1":
waiting to lock monitor 0x00000000032c8aa8 (object 0x00000000d5e9c088, a java.lang.Object),
which is held by "myThread2"
Java stack information for the threads listed above:
===================================================
"myThread2":
at com.bob.concurrency3.MyTest6.myMethod2(MyTest6.java:37)
- waiting to lock <0x00000000d5e9c078> (a java.lang.Object)
- locked <0x00000000d5e9c088> (a java.lang.Object)
at com.bob.concurrency3.MyTest6.lambda$main$1(MyTest6.java:62)
at com.bob.concurrency3.MyTest6$$Lambda$2/1096979270.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"myThread1":
at com.bob.concurrency3.MyTest6.myMethod1(MyTest6.java:27)
- waiting to lock <0x00000000d5e9c088> (a java.lang.Object)
- locked <0x00000000d5e9c078> (a java.lang.Object)
at com.bob.concurrency3.MyTest6.lambda$main$0(MyTest6.java:49)
at com.bob.concurrency3.MyTest6$$Lambda$1/1324119927.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.