狂神---死锁

死锁导致程序卡死

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 + "获得口红的锁");
            }
        }
    }
}

修改之后,得不到资源就释放锁,

相关推荐
jason成都4 分钟前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵30 分钟前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
白山编程大哥37 分钟前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Linux运维技术栈1 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
On The Road :1 小时前
Java 多线程详解:从入门到线程安全
java·python·安全
Shaoshing1 小时前
LeetCode100 49. 字母异位词分组
java·算法
Flynt1 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
划破黑暗的第一缕曙光2 小时前
[C++]:5.STL:string(2)
java·c++·redis
Csvn2 小时前
bundle优化
前端
hhhjhl2 小时前
Undici 跨端三方库仓颉适配全流程
java·开发语言·ubuntu