1、死锁现象举例
线程A抢占了A锁,请求B,线程B抢占了B锁,请求A
2、产生死锁原因
第一 系统资源不足
第二进程运行推进顺序不合适
第三资源分配不当
3、验证是否是死锁
(1)jps -l 类似linux ps -ef
会查出进程id
(2)jstack 进程id jvm自带堆栈跟踪工具
4、代码演示
package juc;
import java.util.concurrent.TimeUnit;
public class DeadLock {
//创建两个对象
static Object a = new Object();
static Object b = new Object();
public static void main(String[] args) {
new Thread(()->{
synchronized (a) {
System.out.println(Thread.currentThread().getName()+" 持有锁a。试图获取锁b");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (b) {
System.out.println(Thread.currentThread().getName()+" 获取锁b");
}
}
},"A").start();
new Thread(()->{
synchronized (b) {
System.out.println(Thread.currentThread().getName()+" 持有锁b。试图获取锁a");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (a) {
System.out.println(Thread.currentThread().getName()+" 获取锁a");
}
}
},"B").start();
}
}