死锁
死锁(英语:Deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。在多任务操作系统中,操作系统为了协调不同进程,能否获取系统资源时,为了让系统运作,必须要解决这个问题。
死锁产生的条件:
在上面的图片中,线程1持有一个资源R1,需要另一个资源R2来完成执行,但R2被线程2锁定,而线程2需要R3,而R3又被线程3锁定。因此,他们中没有一个能结束,陷入僵局
Java中死锁的例子:
package com.zhoufy.example.lock.deadlock;
/**
*
* @author zhoufy
* @date 2019年1月20日 上午10:46:21
*/
public class Write {
public static void main(String[] args){
final Pen pen = new Pen();
final Paper paper = new Paper();
Thread t1 = new Thread(){
public void run(){
synchronized (pen) {
System.out.println("Thread1 is holding Pen");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(paper){
System.out.println("Requesting for Paper");
}
}
}
};
Thread t2 = new Thread(){
public void run(){
synchronized (paper) {
System.out.println("Thread2 is holding Paper");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(pen){
System.out.println("requesting for Pen");
}
}
}
};
t1.start();
t2.start();
}
}
class Pen{}
class Paper{}
输出:
Thread1 is holding Pen
Thread2 is holding Paper
运行后,通过Java VisualVM分析进程的信息:
生成的线程dump:
2019-01-20 10:56:41
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.121-b13 mixed mode):
"DestroyJavaVM" #12 prio=5 os_prio=0 tid=0x00000000034e3800 nid=0x33440 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Thread-1" #11 prio=5 os_prio=0 tid=0x000000001e09e800 nid=0x201a0 waiting for monitor entry [0x000000001eccf000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.zhoufy.example.lock.deadlock.Write$2.run(Write.java:41)
- waiting to lock <0x000000076b463648> (a com.zhoufy.example.lock.deadlock.Pen)
- locked <0x000000076b464c10> (a com.zhoufy.example.lock.deadlock.Paper)
Locked ownable synchronizers:
- None
"Thread-0" #10 prio=5 os_prio=0 tid=0x000000001e09b800 nid=0x3951c waiting for monitor entry [0x000000001ebcf000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.zhoufy.example.lock.deadlock.Write$1.run(Write.java:25)
- waiting to lock <0x000000076b464c10> (a com.zhoufy.example.lock.deadlock.Paper)
- locked <0x000000076b463648> (a com.zhoufy.example.lock.deadlock.Pen)
Locked ownable synchronizers:
- None
"Service Thread" #9 daemon prio=9 os_prio=0 tid=0x000000001e056000 nid=0x27e6c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x000000001dfe2000 nid=0x1ea24 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x000000001dfde000 nid=0x3abcc waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x000000001cc1f800 nid=0x3bc10 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001cc6e800 nid=0x5b6b8 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001dfd8800 nid=0x2da10 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000000035dc000 nid=0x58e28 in Object.wait() [0x000000001df6f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076b388ec8> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
- locked <0x000000076b388ec8> (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)
Locked ownable synchronizers:
- None
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000035d3000 nid=0x53df4 in Object.wait() [0x000000001de6f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000076b386b68> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x000000076b386b68> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=2 tid=0x000000001cbd7800 nid=0x5a1dc runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000034f9800 nid=0x6d5b0 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000034fb000 nid=0x51ed4 runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000000034fc800 nid=0x47728 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000000034ff000 nid=0x3713c runnable
"VM Periodic Task Thread" os_prio=2 tid=0x000000001e089800 nid=0x3cf40 waiting on condition
JNI global references: 6
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00000000035dbbb8 (object 0x000000076b463648, a com.zhoufy.example.lock.deadlock.Pen),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00000000035d9328 (object 0x000000076b464c10, a com.zhoufy.example.lock.deadlock.Paper),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at com.zhoufy.example.lock.deadlock.Write$2.run(Write.java:41)
- waiting to lock <0x000000076b463648> (a com.zhoufy.example.lock.deadlock.Pen)
- locked <0x000000076b464c10> (a com.zhoufy.example.lock.deadlock.Paper)
"Thread-0":
at com.zhoufy.example.lock.deadlock.Write$1.run(Write.java:25)
- waiting to lock <0x000000076b464c10> (a com.zhoufy.example.lock.deadlock.Paper)
- locked <0x000000076b463648> (a com.zhoufy.example.lock.deadlock.Pen)
Found 1 deadlock.
多分析dump文件,有助于提高解决各种高并发问题的能力!!!