死锁

死锁(英语: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文件,有助于提高解决各种高并发问题的能力!!!