Java 如何查看線程死鎖的工具【jps】【jstack】

下面部分內容摘自:《Java多線程編程核心技術》.pdf

死鎖定義

創建項目和線程類

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代碼順序執行了");
				}
			}
		}
	}

}

 

創建運行類

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();
		}
	}
}

 

運行結果:出現死鎖

 

jps命令

jps

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

 

在最後發現一個死鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章