死锁导致程序卡死

java
package Multithreading.Thread.demo04;
//死锁:多个线程互相抱着对方需要的资源,然后形成僵持
public class DeadLock {
public static void main(String[] args) {
Makeup g1 = new Makeup("张三", 1);
Makeup g2 = new Makeup("李四", 0);
g1.start();
g2.start();
}
}
//口红
class Lipstick {
}
//镜子
class Mirror {
}
class Makeup extends Thread {
// static Lipstick lipstick;
// static Mirror mirror; //定义出一个镜子和口红,static确保只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice;//选择
String name;//使用化妆品的人
public Makeup(String name, int choice) {
this.name = name;
this.choice = choice;
}
@Override
public void run() {
//化妆
try {
makeup();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//化妆,互相持有对方的锁,就是需要拿到对方的资源
private void makeup() throws InterruptedException {
if (choice == 1) {
synchronized (lipstick) {//获得口红的锁
System.out.println(this.name + "获得口红的锁");
Thread.sleep(1000);
synchronized (mirror) {//一秒后想获得镜子
System.out.println(this.name + "获得镜子的锁");
}
}
} else {
synchronized (mirror) {//获得镜子的锁
System.out.println(this.name + "获得镜子的锁");
Thread.sleep(2000);
synchronized (lipstick) {//一秒后想获得口红
System.out.println(this.name + "获得口红的锁");
}
}
}
}
}

卡死,死锁了,互相僵持住
java
package Multithreading.Thread.demo04;
//死锁:多个线程互相抱着对方需要的资源,然后形成僵持
public class DeadLock {
public static void main(String[] args) {
Makeup g1 = new Makeup("张三", 1);
Makeup g2 = new Makeup("李四", 0);
g1.start();
g2.start();
}
}
//口红
class Lipstick {
}
//镜子
class Mirror {
}
class Makeup extends Thread {
// static Lipstick lipstick;
// static Mirror mirror; //定义出一个镜子和口红,static确保只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice;//选择
String name;//使用化妆品的人
public Makeup(String name, int choice) {
this.name = name;
this.choice = choice;
}
@Override
public void run() {
//化妆
try {
makeup();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//化妆,互相持有对方的锁,就是需要拿到对方的资源
private void makeup() throws InterruptedException {
if (choice == 1) {
synchronized (lipstick) {//获得口红的锁
System.out.println(this.name + "获得口红的锁");
Thread.sleep(1000);
}
synchronized (mirror) {//一秒后想获得镜子
System.out.println(this.name + "获得镜子的锁");
}
} else {
synchronized (mirror) {//获得镜子的锁
System.out.println(this.name + "获得镜子的锁");
Thread.sleep(2000);
}
synchronized (lipstick) {//一秒后想获得口红
System.out.println(this.name + "获得口红的锁");
}
}
}
}
修改之后,得不到资源就释放锁,