首页 > 编程语言 > 详细

线程死锁

时间:2021-03-27 16:34:24      阅读:21      评论:0      收藏:0      [点我收藏+]

产生死锁的四个必要条件:

  1. 互斥条件:一个资源每次只能被一个进程使用
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已经获得的资源保持不放
  3. 不剥夺条件:进程已经获得的资源,在未使用完之前不进行强行剥夺
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

只要想办法破坏四个必要条件中的任意一个或多个,就能避免死锁发送

package thread;

import javax.swing.plaf.synth.SynthCheckBoxMenuItemUI;

/**
 * @author scy
 * @create 2021-03-27 14:39
 */

//死锁:多个线程互相抱着对方需要的资源,然后形成僵持
public class DeadLock {
    public static void main(String[] args) {
        Makeup g1 = new Makeup(0,"g1");
        Makeup g2 = new Makeup(1,"g2");

        g1.start();
        g2.start();
    }
}

//口红
class Lipstick{

}
//镜子
class Mirror{

}

class Makeup extends Thread{

    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choice;
    String girlName;

    Makeup(int choice, String girlName){
        this.choice = choice;
        this.girlName = girlName;
    }

    @Override
    public void run() {
        //化妆
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //写个方法:化妆,互相持有对方的锁,就是需要拿到对方的资源
    private void makeup() throws InterruptedException{
        if(choice == 0){
            synchronized (lipstick){//获得口红的锁
                System.out.println(this.girlName + "获得口红的锁");
                Thread.sleep(1000);
                synchronized (mirror){//获得镜子的锁
                    System.out.println(this.girlName+"活得镜子的锁");
                }
            }

        }else{
            synchronized (mirror){//获得镜子的锁
                System.out.println(this.girlName+"获得镜子的锁");
                Thread.sleep(1000);
                synchronized (lipstick){//获得口红的锁
                    System.out.println(this.girlName+"获得口红的锁");
                }
            }

        }
    }
}

输出结果:
技术分享图片

破坏其必要条件:

package thread;

import javax.swing.plaf.synth.SynthCheckBoxMenuItemUI;

/**
 * @author scy
 * @create 2021-03-27 14:39
 */

//死锁:多个线程互相抱着对方需要的资源,然后形成僵持
public class DeadLock {
    public static void main(String[] args) {
        Makeup g1 = new Makeup(0,"g1");
        Makeup g2 = new Makeup(1,"g2");

        g1.start();
        g2.start();
    }
}

//口红
class Lipstick{

}
//镜子
class Mirror{

}

class Makeup extends Thread{

    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choice;
    String girlName;

    Makeup(int choice, String girlName){
        this.choice = choice;
        this.girlName = girlName;
    }

    @Override
    public void run() {
        //化妆
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    //写个方法:化妆,互相持有对方的锁,就是需要拿到对方的资源
    private void makeup() throws InterruptedException{
        if(choice == 0){
            synchronized (lipstick){//获得口红的锁
                System.out.println(this.girlName + "获得口红的锁");
                Thread.sleep(1000);
            }
            synchronized (mirror){//获得镜子的锁
                System.out.println(this.girlName+"活得镜子的锁");
            }

        }else{
            synchronized (mirror){//获得镜子的锁
                System.out.println(this.girlName+"获得镜子的锁");
                Thread.sleep(1000);
            }
            synchronized (lipstick){//获得口红的锁
                System.out.println(this.girlName+"获得口红的锁");
            }

        }
    }
}

输出结果:
技术分享图片

线程死锁

原文:https://www.cnblogs.com/helloMargaret/p/14585907.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!