狂神---死锁

死锁导致程序卡死

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

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

相关推荐
小小小小宇几秒前
Vue `import` 为什么可以异步加载
前端
yaoxin5211232 分钟前
405. Java 文件操作基础 - 装饰者模式与 I/O Streams
java·开发语言·python
xiufeia3 分钟前
后端项目初始化的一些小坑点
java·junit·maven·idea
丑八怪大丑4 分钟前
JDBC基础篇
java·sql
WMYeah5 分钟前
【无标题】
前端·rust·抽奖程序·跨平台抽奖程序
Unbelievabletobe6 分钟前
免费外汇api的响应时间在不同时段下的波动分析
大数据·开发语言·前端·python
大哥,带带弟弟16 分钟前
Grafana 前端嵌入与 JWT 鉴权实战
前端·grafana
小小小小宇17 分钟前
前端 V8 引擎垃圾回收机制与内存问题排查
前端
环流_20 分钟前
Redis:epoll和IO多路复用
java·redis·mybatis
Chase_______23 分钟前
Java基础语言 ④ :面向对象核心——构造方法、this关键字与对象内存模型详解
java·开发语言·面向对象·类与对象