1、 什么是死锁
- 多个线程各自占有一些资源,并相互等待其他线程占有的资源 才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。
- 一个同步块,同时拥有"两个以上对象的锁",就可能会发生”死锁“的问题。
化妆例子
public class DeadLock {
public static void main(String[] args) {
Thread t1 = new MakeUp(0,"灰姑娘");
Thread t2 = new MakeUp(1,"白雪公主");
t1.start();
t2.start();
}
}
class LipStick{
}
class Mirror{
}
class MakeUp extends Thread{
static Mirror mirror = new Mirror();
static LipStick lipStick = new LipStick();
int choice;
String name;
public MakeUp(int choice,String name){
this.choice = choice;
this.name= name;
}
@Override
public void run() {
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void makeup() throws InterruptedException {
if (choice==0){
synchronized (lipStick){
System.out.println(name+"使用口红");
Thread.sleep(1000);
synchronized (mirror){
System.out.println(name+"使用镜子");
}
}
}else {
synchronized (mirror){
System.out.println(name+"使用镜子");
Thread.sleep(1000);
synchronized (lipStick){
System.out.println(name+"使用口红");
}
}
}
}
}
白雪公主使用镜子
灰姑娘使用口红
2、产生死锁的条件
- 互斥条件
- 请求与保持条件
- 一个进程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件
- 循环等待条件
只要:破坏其中任意一个或者多个必要条件,就可以避免死锁的发生。
例子修正
public void makeup() throws InterruptedException {
if (choice==0){
synchronized (lipStick){
System.out.println(name+"使用口红");
Thread.sleep(1000);
}
synchronized (mirror){
System.out.println(name+"使用镜子");
}
}else {
synchronized (mirror){
System.out.println(name+"使用镜子");
Thread.sleep(1000);
}
synchronized (lipStick){
System.out.println(name+"使用口红");
}
}
}
白雪公主使用镜子
灰姑娘使用口红
白雪公主使用口红
灰姑娘使用镜子