美文网首页
9、死锁

9、死锁

作者: 金石_832e | 来源:发表于2021-12-20 10:09 被阅读0次
package com.example.demo.thread;

/**
 * @projectName: demo
 * @package: com.example.demo.thread
 * @className: TestDeath
 * @author: 
 * @description: 测试死锁:多个线程互相拥有相同的资源会出现死锁现象
 * @date: 2021/12/8 14:56
 */
public class TestDeath {
    public static void main(String[] args) {
        MakeUp zmakeUp = new MakeUp(1, "张三");
        MakeUp lmakeUp = new MakeUp(0, "李三");
        new Thread(zmakeUp).start();
        new Thread(lmakeUp).start();
    }
}

class MakeUp implements Runnable {
    // static在创建对象前初始化,保证唯一性
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choose;
    String personName;

    public MakeUp(int choose, String personName) {
        this.choose = choose;
        this.personName = personName;
    }


    @Override
    public void run() {
        if (choose == 0) {
            synchronized (lipstick) {
                System.out.println(personName + ":先使用口红化妆");
                System.out.println("口红哈希" + lipstick.hashCode());
                try {
                    Thread.sleep(1000);
                    synchronized (mirror) {
                        System.out.println(personName + ":再使用镜子化妆");
                        System.out.println("镜子哈希" + mirror.hashCode());
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        } else {
            synchronized (mirror) {
                System.out.println(personName + ":再使用镜子化妆");
                System.out.println("镜子哈希" + mirror.hashCode());
                try {
                    Thread.sleep(1000);
                    synchronized (lipstick) {
                        System.out.println(personName + ":先使用口红化妆");
                        System.out.println("口红哈希" + lipstick.hashCode());
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

class Lipstick {

}

class Mirror {

}
资源不放

上面样例解决方案

synchronized不要嵌套使用

package com.example.demo.thread;

/**
 * @projectName: demo
 * @package: com.example.demo.thread
 * @className: TestDeath
 * @author:
 * @description: 测试死锁:synchronized块中不要出现另一个synchronized块
 * @date: 2021/12/8 14:56
 */
public class TestDeath {
    public static void main(String[] args) {
        MakeUp zmakeUp = new MakeUp(1, "张三");
        MakeUp lmakeUp = new MakeUp(0, "李三");
        new Thread(zmakeUp).start();
        new Thread(lmakeUp).start();
    }
}

class MakeUp implements Runnable {
    // static在创建对象前初始化,保证唯一性
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choose;
    String personName;

    public MakeUp(int choose, String personName) {
        this.choose = choose;
        this.personName = personName;
    }


    @Override
    public void run() {
        if (choose == 0) {
            synchronized (lipstick) {
                System.out.println(personName + ":先使用口红化妆");
                System.out.println("口红哈希" + lipstick.hashCode());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (mirror) {
                    System.out.println(personName + ":再使用镜子化妆");
                    System.out.println("镜子哈希" + mirror.hashCode());
                }
            }
        } else {
            synchronized (mirror) {
                System.out.println(personName + ":再使用镜子化妆");
                System.out.println("镜子哈希" + mirror.hashCode());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            synchronized (lipstick) {
                System.out.println(personName + ":先使用口红化妆");
                System.out.println("口红哈希" + lipstick.hashCode());
            }
        }
    }
}

class Lipstick {

}

class Mirror {

}
image.png

相关文章

  • 9、死锁

    上面样例解决方案 synchronized不要嵌套使用

  • Mysql Insert 死锁问题研究

    Mysql Insert 死锁问题研究[#mysql-insert-%E6%AD%BB%E9%94%81%E9%9...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 死锁

    第11章:死锁和进程通信 死锁概念 死锁处理方法 死锁预防(Deadlock Prevention) 死锁避免(D...

  • java多线程笔记

    产生死锁的四个必要条件 处理死锁的基本方法 死锁预防 死锁避免 死锁检测 死锁解除 https://blog.cs...

  • [现代操作系统]--死锁

    table of content 死锁定义 死锁建模-- 资源分配图 处理死锁鸵鸟算法检测并恢复死锁检测死锁恢复利...

  • Java-多线程(四)死锁

    死锁 死锁示例

  • Java死锁

    什么是死锁 死锁检测 产生死锁的四个必要条件 如何避免死锁 死锁 死锁,指两个或多个线程之间,由于互相持有对方需要...

  • java并发--java死锁

    本篇结构: 前言 什么是死锁 产生死锁的必要条件 死锁的代码示例 死锁排查 如何避免死锁 总结 一、前言 今天被问...

  • Java多线程之死锁(Deadlock)及死锁避免(Deadlo

    线程死锁(Thread Deadlock) 数据库死锁(Database Deadlocks) 死锁避免 (Dea...

网友评论

      本文标题:9、死锁

      本文链接:https://www.haomeiwen.com/subject/ibetfrtx.html