狂神---死锁

死锁导致程序卡死

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

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

相关推荐
_山海10 小时前
Bun入门指南
前端·javascript·后端
想睡懒觉10 小时前
我用 CSS 3D 做了个星空隧道 Loading,没有 Three.js
前端
labixiong11 小时前
transition 写在 CSS 变量上为什么不生效?给变量补张「类型身份证」
前端·css·html
YHL11 小时前
🧠 Agent 记忆进阶:总结压缩与向量检索 —— 从截断到 Milvus 长期记忆
前端·人工智能
2301_322414280411 小时前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
YHL11 小时前
🎯 JavaScript 单例模式(Singleton Pattern)—— 从理论到实战
javascript·设计模式
君顾111 小时前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
用户9210802628611 小时前
前端 Vue 专栏 05:从 Object.defineProperty 到 Proxy,彻底理解 Vue 响应式原理
前端
Fluxart.ai11 小时前
GPT Image 2.5 有使用次数限制吗?额度、并发、频率限制说明
服务器·前端·gpt
程序员海军11 小时前
AI 越来越强,为什么打工人反而越来越累、越来越内耗了?
前端·程序员·aigc