セブン、デッドロック
1.問題は
class DeadLock {
private final Object LOCK_A = new Object();
private final Object LOCK_B = new Object();
public void methodA() {
synchronized (LOCK_A) {
try {
Thread.sleep(1000); } catch (InterruptedException e) {
e.printStackTrace(); }
System.out.println(Thread.currentThread().getName() + "获取锁A,尝试获取锁B");
synchronized (LOCK_B) {
}
}
}
public void methodB() {
synchronized (LOCK_B) {
try {
Thread.sleep(1000); } catch (InterruptedException e) {
e.printStackTrace(); }
System.out.println(Thread.currentThread().getName() + "获取锁B,尝试获取锁A");
synchronized (LOCK_A) {
}
}
}
}
public class DeadLockTest {
public static void main(String[] args) {
DeadLock dl = new DeadLock();
new Thread(dl::methodA, "线程A").start();
new Thread(dl::methodB, "线程B").start();
}
}
コードを実行すると、プログラムがブロックされて実行できないことがわかります
2.問題の原因
ロックを取得した複数のスレッドが、他のスレッドによってすでに保持されているロックを取得しようとすると、デッドロックが発生します
3.トラブルシューティング方法
Javaに付属の2つのコマンドを使用します:jps
およびjstack
最初に次のコマンドを実行します。実行jps -l
中のJavaプログラムのプロセスIDを取得します。
次に、コマンドを実行しjstack -l 进程ID
ます。、次の同様の情報が表示されます。
"线程B" #12 prio=5 os_prio=0 tid=0x000000001657a800 nid=0x65c waiting for monitor entry [0x0000000016d8f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at DeadLock.methodB(DeadLockTest.java:21)
- waiting to lock <0x00000000f57e2568> (a java.lang.Object)
- locked <0x00000000f57e2578> (a java.lang.Object)
at DeadLockTest$$Lambda$2/205797316.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"线程A" #11 prio=5 os_prio=0 tid=0x0000000016579800 nid=0x4f4 waiting for monitor entry [0x0000000016c8e000]
java.lang.Thread.State: BLOCKED (on object monitor)
at DeadLock.methodA(DeadLockTest.java:11)
- waiting to lock <0x00000000f57e2578> (a java.lang.Object)
- locked <0x00000000f57e2568> (a java.lang.Object)
at DeadLockTest$$Lambda$1/1637070917.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
Found one Java-level deadlock:
=============================
"线程B":
waiting to lock monitor 0x0000000002ffde38 (object 0x00000000f57e2568, a java.lang.Object),
which is held by "线程A"
"线程A":
waiting to lock monitor 0x0000000002ffb658 (object 0x00000000f57e2578, a java.lang.Object),
which is held by "线程B"
Java stack information for the threads listed above:
===================================================
"线程B":
at DeadLock.methodB(DeadLockTestjava:21)
- waiting to lock <0x00000000f57e2568> (a java.lang.Object)
- locked <0x00000000f57e2578> (a java.lang.Object)
at DeadLockTest$$Lambda$2/205797316.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"线程A":
at DeadLock.methodA(DeadLockTestjava:11)
- waiting to lock <0x00000000f57e2578> (a java.lang.Object)
- locked <0x00000000f57e2568> (a java.lang.Object)
at DeadLockTest$$Lambda$1/1637070917.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
デッドロックの場所は明確にマークされています