下面部分內容摘自:《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