死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉则它们都无法推进下去。如果系统资源充足,进程的资源请求都能得到满足,死锁出现的可能性会降低,否则就会因为争夺有限的资源而陷入死锁。

测试案例
package com.binfoo.deadedlock;import java.util.concurrent.TimeUnit;public class LockTest {public static void main(String[] args) {Dead dead = new Dead();new Thread(dead::A, "1").start();new Thread(dead::B, "2").start();}}class Dead {final Object a = new Object();final Object b = new Object();public void A() {synchronized (a) {System.out.println(Thread.currentThread().getName() + "持有 a 锁");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}synchronized (b) {System.out.println(Thread.currentThread().getName() + "持有 b 锁");}}}public void B() {synchronized (b) {System.out.println(Thread.currentThread().getName() + "持有 b 锁");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}synchronized (a) {System.out.println(Thread.currentThread().getName() + "持有 a 锁");}}}}
运行结果如下。
jps -ljstack

产生原因
系统资源不足
进程运行推进的顺序不合适
资源分配不当
