美文网首页
线程死锁

线程死锁

作者: 何几时 | 来源:发表于2020-11-30 20:31 被阅读0次

死锁定义

多个线程各自占用共享资源,都在等待对方线程释放资源来继续运行,某一个同步块内若同时拥有两个以上对象的锁时,就会发生死锁现象

死锁避免方法

产生死锁的四个必要条件

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

化妆例子

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

        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;  // 使用化妆品的人


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

    @Override
    public void run() {
        // 化妆
        makeup();
    }

    // 化妆,互相持有对方的锁,就是需要拿到对方的资源
    private void makeup() {
        if (choice==0) {
            synchronized (lipstick) {  // 获得口号的锁
                System.out.println(this.girlName + "获得口红的锁");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (mirror) {
                    System.out.println(this.girlName + "获得镜子的锁");
                }

            }
        }else {
            synchronized (mirror) {  // 获得口号的锁
                System.out.println(this.girlName + "获得镜子的锁");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (lipstick) {
                    System.out.println(this.girlName + "获得口红的锁");
                }

            }
        }
    }
}

改进版本(把同步块内的另一个同步块拿出来)

package demo04_synchronized;

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

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

}

// 口红
class Lipstick01{

}

// 镜子
class Mirror01{

}

class Makeup01 extends Thread{

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

    int choice; // 选择
    String girlName;  // 使用化妆品的人


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

    @Override
    public void run() {
        // 化妆
        makeup();
    }

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

相关文章

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • Python中的各种锁

    Python之死锁 死锁分为两种情况,多进程/线程的死锁.或者是单线程的死锁. 1.首先看一下单线程的死锁,单线程...

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 死锁

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

  • 6. 使用synchronized实现死锁

    死锁定义 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 面试官:连多线程问题你都一问三不知,还要我怎么“放水”?

    面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁? 程序员阿里:这个...死锁......

  • 十.Java并发编程的挑战

    1. 死锁 线程死锁 死锁是指两个或多个线程被阻塞等待获取某些其他线程所持有的锁。当多个线程同时需要相同的锁,但以...

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

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

  • Java自学-多线程 死锁

    Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生死锁 步骤 1 : 演示死锁 线程1 首先占有对...

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

网友评论

      本文标题:线程死锁

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