死锁:我自己的理解就是,A和B两个方法都想要对象的东西,而都不想松手,从而造成了死锁,
产生死锁的四个条件:
-
互斥条件:一个资源每次只能被一个进程使用
-
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
-
不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
-
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系.
例如:A(小孩)和B(小孩),A手里有一个玩具手枪,B手机有一个玩具汽车,A想玩B的,B也想玩A的,但是,两个人都不愿意给对方自己手里的玩具,从而造成了打架
具体代码如下:
自己的女朋友和妹妹每天都要化妆,一个是口红,一个是镜子,(假设都只有一个),就会出现这种情况
public class DeadLock {
public static void main(String[] args) {
Makeup girl1 = new Makeup(0, "灰姑娘");
Makeup girl2 = new Makeup(1, "白雪公主");
girl1.start();
girl2.start();
}
}
//口红
class Lipstick{}
//镜子
class Mirror{}
//化妆
class Makeup extends Thread{
//需要的资源只有一份,用static来保证只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice;//选择用哪个
String girlName;//用化妆品的名字
//构造方法
public Makeup(int choice,String girlName){
this.girlName = girlName;
this.choice = choice;
}
@Override
public void run() {
//化妆
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//化妆
private void makeup() throws InterruptedException {
if (choice == 0){
synchronized (lipstick){//获取到口红的锁
System.out.println(this.girlName+"获取到口红的锁");
Thread.sleep(1000 );
synchronized (mirror){//一秒种后获得镜子
System.out.println(this.girlName+"获取到镜子的锁");
}
}
}else {
synchronized (mirror){//获取到镜子的锁
System.out.println(this.girlName+"获取到镜子的锁");
Thread.sleep(2000 );
synchronized (lipstick){//两秒种后获得口红的锁
System.out.println(this.girlName+"获取到口红的锁");
}
}
}
}
}
那应该怎么解决呢,就是两个锁分开写,就可以了,不要把两个锁写在一个判断里面
//化妆
private void makeup() throws InterruptedException {
if (choice == 0){
synchronized (lipstick){//获取到口红的锁
System.out.println(this.girlName+"获取到口红的锁");
Thread.sleep(1000 );
}
synchronized (mirror){//一秒种后获得镜子
System.out.println(this.girlName+"获取到镜子的锁");
}
}else {
synchronized (mirror){//获取到镜子的锁
System.out.println(this.girlName+"获取到镜子的锁");
Thread.sleep(2000 );
}
synchronized (lipstick){//两秒种后获得口红的锁
System.out.println(this.girlName+"获取到口红的锁");
}
}
}


被折叠的 条评论
为什么被折叠?



