死锁
- 如果出现了同步嵌套,那么必定会产生死锁问题;
- 两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象。
产生死锁的条件
- 互斥条件:一个资源每次只能被一个进程使用;
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
- 不剥夺条件:进程已获得的资源,只有自己可以释放资源,不可以被强行剥夺;
- 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。
举个例子:
小丽和小红是一对好朋友,有一天她们两个都想要化妆,刚开始,小丽拿了镜子,小红拿了口红,然后小丽等待小红释放口红的资源,小红等待小丽释放镜子的资源,两个线程互相等待对方释放资源。
代码实现:
public class TestDeadLock {
public static void main(String[] args) {
MakeUp girl1 = new MakeUp(true,"小丽");
MakeUp girl2 = new MakeUp(false,"小红");
new Thread(girl1).start();
new Thread(girl2).start();
}
}
class MakeUp extends Thread {
static String mirror = new String();
static String tipStick = new String();
boolean flag = true;
String girlName;
public MakeUp(boolean flag,String girlName) {
this.flag = flag;
this.girlName = girlName;
}
public String getGirlName(){
return girlName;
}
@Override
public void run() {
if (flag) {
synchronized (mirror) {
System.out.println( getGirlName()+ "拿到了镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (tipStick) {
System.out.println(getGirlName() + "拿到了口红");
}
}
} else {
synchronized (tipStick) {
System.out.println(getGirlName() + "拿到了口红");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror) {
System.out.println(getGirlName() + "拿到了镜子");
}
}
}
}
}
运行结果如上图所示,就造成了死锁,在我们以后的开发中一定要避免死锁的问题。