java 查看线程死锁_Java 如何查看线程死锁的工具【jps】【jstack】

本文通过一个简单的Java死锁示例,展示了如何使用`jps`和`jstack`命令来检测和分析线程死锁问题。通过`jps`获取进程ID,然后使用`jstack -l 进程ID`查看线程堆栈信息,揭示了两个线程分别持有对方等待的锁,导致死锁的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面部分内容摘自:《Java多线程编程核心技术》.pdf

死锁定义

db413b390f5107b3c20858ccceb4f4b2.png

创建项目和线程类

5cb13163474a236edf4e1727a6e310b1.png

package chapter02.section02.thread_2_2_12.project_1_deadLockTest;

public class DealThread implements Runnable {

public String username;

public Object lock1 = new Object();

public Object lock2 = new Object();

public void setFlag(String username) {

this.username = username;

}

@Override

public void run() {

if (username.equals("a")) {

synchronized (lock1) {

try {

System.out.println("username = " + username);

Thread.sleep(3000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

synchronized (lock2) {

System.out.println("按lock1->lock2代码顺序执行了");

}

}

}

if (username.equals("b")) {

synchronized (lock2) {

try {

System.out.println("username = " + username);

Thread.sleep(3000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

synchronized (lock1) {

System.out.println("按lock2->lock1代码顺序执行了");

}

}

}

}

}

创建运行类

2ddd109824816d33b5b87ec1feb223a1.png

package chapter02.section02.thread_2_2_12.project_1_deadLockTest;

public class Run {

public static void main(String[] args) {

try {

DealThread t1 = new DealThread();

t1.setFlag("a");

Thread thread1 = new Thread(t1);

thread1.start();

Thread.sleep(100);

t1.setFlag("b");

Thread thread2 = new Thread(t1);

thread2.start();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

运行结果:出现死锁

193d91ac387fd4261447cc6ed31435b0.png

bb09989ae4f4643a7cd634d54f4867bf.png

jps命令

jps

2bda863777d10b60d5b33489f33ba638.png

89f97ed45f80069f07bb4eda88ee9a9a.png

jstack命令

jstack -l 18776

C:\program\Java\jdk1.6.0_45\bin>jstack -l 18776

2020-02-13 11:15:27

Full thread dump Java HotSpot(TM) Client VM (20.45-b01 mixed mode, sharing):

"DestroyJavaVM" prio=6 tid=0x00e6ac00 nid=0x40cc waiting on condition [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"Thread-1" prio=6 tid=0x0255c000 nid=0x53c0 waiting for monitor entry [0x04d8f000]

java.lang.Thread.State: BLOCKED (on object monitor)

at chapter02.section02.thread_2_2_12.project_1_deadLockTest.DealThread.run(DealThread.java:39)

- waiting to lock <0x2442c848> (a java.lang.Object)

- locked <0x2442c850> (a java.lang.Object)

at java.lang.Thread.run(Thread.java:662)

Locked ownable synchronizers:

- None

"Thread-0" prio=6 tid=0x02517800 nid=0x8e8 waiting for monitor entry [0x04cff000]

java.lang.Thread.State: BLOCKED (on object monitor)

at chapter02.section02.thread_2_2_12.project_1_deadLockTest.DealThread.run(DealThread.java:25)

- waiting to lock <0x2442c850> (a java.lang.Object)

- locked <0x2442c848> (a java.lang.Object)

at java.lang.Thread.run(Thread.java:662)

Locked ownable synchronizers:

- None

"Low Memory Detector" daemon prio=6 tid=0x0250e800 nid=0x4ec0 runnable [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"C1 CompilerThread0" daemon prio=10 tid=0x02520800 nid=0x5074 waiting on condition [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"Monitor Ctrl-Break" daemon prio=6 tid=0x02521c00 nid=0x3864 runnable [0x04a7f000]

java.lang.Thread.State: RUNNABLE

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:129)

at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)

at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)

at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)

- locked <0x2441b158> (a java.io.InputStreamReader)

at java.io.InputStreamReader.read(InputStreamReader.java:167)

at java.io.BufferedReader.fill(BufferedReader.java:136)

at java.io.BufferedReader.readLine(BufferedReader.java:299)

- locked <0x2441b158> (a java.io.InputStreamReader)

at java.io.BufferedReader.readLine(BufferedReader.java:362)

at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)

Locked ownable synchronizers:

- None

"Attach Listener" daemon prio=10 tid=0x024ec000 nid=0x2378 waiting on condition [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"Signal Dispatcher" daemon prio=10 tid=0x024eb000 nid=0x3620 runnable [0x00000000]

java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:

- None

"Finalizer" daemon prio=8 tid=0x024de000 nid=0x5690 in Object.wait() [0x048cf000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on <0x243b1148> (a java.lang.ref.ReferenceQueue$Lock)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)

- locked <0x243b1148> (a java.lang.ref.ReferenceQueue$Lock)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)

at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

Locked ownable synchronizers:

- None

"Reference Handler" daemon prio=10 tid=0x024dcc00 nid=0x1ab4 in Object.wait() [0x0483f000]

java.lang.Thread.State: WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on <0x243b1048> (a java.lang.ref.Reference$Lock)

at java.lang.Object.wait(Object.java:485)

at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)

- locked <0x243b1048> (a java.lang.ref.Reference$Lock)

Locked ownable synchronizers:

- None

"VM Thread" prio=10 tid=0x024a0800 nid=0x4a7c runnable

"VM Periodic Task Thread" prio=10 tid=0x02516400 nid=0x48f0 waiting on condition

JNI global references: 921

Found one Java-level deadlock:

=============================

"Thread-1":

waiting to lock monitor 0x024e3534 (object 0x2442c848, a java.lang.Object),

which is held by "Thread-0"

"Thread-0":

waiting to lock monitor 0x024e296c (object 0x2442c850, a java.lang.Object),

which is held by "Thread-1"

Java stack information for the threads listed above:

===================================================

"Thread-1":

at chapter02.section02.thread_2_2_12.project_1_deadLockTest.DealThread.run(DealThread.java:39)

- waiting to lock <0x2442c848> (a java.lang.Object)

- locked <0x2442c850> (a java.lang.Object)

at java.lang.Thread.run(Thread.java:662)

"Thread-0":

at chapter02.section02.thread_2_2_12.project_1_deadLockTest.DealThread.run(DealThread.java:25)

- waiting to lock <0x2442c850> (a java.lang.Object)

- locked <0x2442c848> (a java.lang.Object)

at java.lang.Thread.run(Thread.java:662)

Found 1 deadlock.

C:\program\Java\jdk1.6.0_45\bin>j

在最后发现一个死锁

0dae434daa0c789fe4e5a9aca122c907.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值