目录
1、什么是死锁?
当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他同步。这时会引发一种现象:程序出现无限等待,这种现象我们称为死锁。简单理解:指两个线程或多个线程相互持有对方所需要的资源,导致线程都处于等待状态,无法往下执行,这就是死锁!
2、代码演示
public class DicLock extends Thread {
//定义boolean类型变量控制程序入口
private boolean flag;
public DicLock(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
//如果为true,则先执行objA,flase则执行objB
if(flag){
synchronized (MyLock.objA){
System.out.println("if objA");
synchronized (MyLock.objB){
System.out.println("if objB");
}
}
//false则进入
}else{
synchronized (MyLock.objB){
System.out.println("else objB");
synchronized (MyLock.objA){
System.out.println("if objA");
}
}
}
}
}
public class MyLock {
//创建两个锁对象
public static final Object objA = new Object();
public static final Object objB = new Object();
}
//测试类
public class Test {
public static void main(String[] args) {
//创建对象传递true,执行objA
DicLock d1=new DicLock(true);
d1.start();
//创建对象传递false,执行objB
DicLock d2=new DicLock(false);
d2.start();
}
}
发现程序一直在进行着,并没有执行完毕,可见是发生了死锁,objA在等待objB执行完毕,而objB在等待objA执行完毕,这样objA和objB会一直等待对方,谁也不让步,则发生死锁。
3、死锁的四个必要条件
1、互斥条件:一个资源每次只能被一个进程使用。
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
4、处理死锁的四种策略
1、预防死锁
通过设置一些限制条件,去破坏产生死锁的必要条件(见3、死锁的四个必要条件)
2、避免死锁
在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁
3、检测死锁
允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉
4、解除死锁
与检测死锁配合使用