死锁介绍
一、死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
二、死锁产生的必要条件
- 互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
- 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
- 环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
三、解决死锁的方法
- 资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
- 只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
- 可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
- 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
四、死锁的产生(代码)
/**
* @Description 死锁demo
* @Author lcy
* @Date 2020/9/1 14:15
*/
public class DeadLockDemo {
private static final String LOCK_A = "LOCK_A";
private static final String LOCK_B = "LOCK_B";
public static void main(String[] args){
new Thread(()->{
synchronized (LOCK_A){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (LOCK_B){
System.out.println("线程1获取到了AB资源");
}
}
}).start();
new Thread(()->{
synchronized (LOCK_B){
synchronized (LOCK_A){
System.out.println("线程2获取到了AB资源");
}
}
}).start();
}
}
五、查看java的进程
在cmd命令里执行jconsole,打开控制台。选择相应的项目,点击不安全连接,进入找到线程列表,左下角查看检查死锁,就能找到死锁的线程。