首页 > 其他分享 >死锁

死锁

时间:2023-08-25 15:36:52浏览次数:26  
标签:girlName MakeUp choice 死锁 new 资源

死锁

1.死锁

多个线程各自占有一些共享资源﹐并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源﹐都停止执行的情形﹒某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。

// 死锁:多个线程互相抱着对方需要的资源,然后形成僵持。
public class DeadLock {

   public static void main(String[] args) {
       MakeUp q1 = new MakeUp(0,"灰姑娘");
       MakeUp q2 = new MakeUp(1,"公主");
       q1.start();
       q2.start();

  }

}

// 口红
class Lipstick{

}

//镜子
class Mirror{

}

//化妆
class MakeUp extends Thread{

   //需要的资源只有一份,用static来保证只有一份
   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() {
       //化妆
       try {
           makeup();
      } catch (InterruptedException e) {
           throw new RuntimeException(e);
      }
  }

   // 化妆,互相持有对方的锁,就是需要拿到对方的资源
   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(2000);
          }
           synchronized (lipstick){
               //一秒钟后获得口红
               System.out.println(this.girlName + "获得口红锁");
          }
      }
  }


}
2.产生死锁的四个必要条件:
  1. 互斥条件:一个资源每次只能被一个进程使用。

  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

  4. 循环等待条件∶若干进程之间形成一种头尾相接的循环等待资源关系。

  5. 上面列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件就可以避免死锁发生

  6.  

标签:girlName,MakeUp,choice,死锁,new,资源
From: https://www.cnblogs.com/yuan947022015/p/17657065.html

相关文章

  • 【校招VIP】专业课考点之死锁检测与恢复
    考点介绍:根据不少同学的面试反馈,最近阿里和字节跳动面试时面试官都问到了死锁问题。如字节跳动考察的问题是:什么是线程死锁?死锁如何产生?死锁如何检测与恢复?其产生的原理与对应的解决方案都是重点考察对象。一、考点试题1.死锁如何检测与解除?解答:死锁检测需要一种数据结构,保......
  • InnoDB 中的死锁
    目录死锁死锁示例死锁检测禁用死锁检测如何最小化和处理死锁事务调度死锁死锁是指不同事务无法继续进行的情况,因为每个事务都持有另一个事务需要的锁。因为两个事务都在等待资源变得可用,所以都不会释放它所持有的锁。当事务锁定多个表中的多个行(通过UPDATE或SELECT...FOR......
  • java线程死锁怎么处理
    在Java中,线程死锁是指两个或多个线程被阻塞,因为它们互相等待对方释放资源。这种情况下,线程将永远无法继续执行下去。处理线程死锁的方法之一是使用以下步骤:1.分析死锁:确定哪些线程和资源参与了死锁,并找出造成死锁的原因。你可以使用工具如线程转储分析工具(ThreadDumpAnalyzer)或......
  • 互斥量概念、用法、死锁演示及解决详解
    互斥量概念、用法、死锁演示及解决详解视频:https://www.bilibili.com/video/BV1Yb411L7ak?p=7&vd_source=4c026d3f6b5fac18846e94bc649fd7d0参考文章:https://blog.csdn.net/qq_38231713/article/details/106091902互斥量(mutex)如果想深入了解可以具体看一下操作系统互斥量的讲......
  • 记一次MySQL死锁问题排查
    事情的起因:我司有一款应用处于新旧系统切换阶段,新旧服务同时穿插运行,新服务不断迭代的同时来不断下线旧服务,其中有一个编辑客户信息的功能因为工作量太大,所以其中一部分内容是通过RPC的方式调用新服务的API进行保存的,然后在出现了一个神奇的问题,RPC接口频繁超时,于是我对RPC接口......
  • java死锁、线程状态、线程通信、线程池
    1.回顾java实现多线程:[1]继承Thread类并重写run方法[2]实现Runnable接口线程Thread中常用的方法:setName():Thread.currentThread().getName():​staticvoidsleep();staticvoidyield():join():setDeamon()设置后台线程线程安全问题:---当......
  • 浅谈死锁
    1.死锁是如何产生 多个线程同时被阻塞它们其中的一个或者多个等待某个资源的释放而由于线程全部阻塞,资源的释放无限期的延迟因此程序不可能终止2.死锁的三个典型情况2.1一个线程一把锁,可重入锁没事,不可重入锁死锁2.2两个线程两把锁,即使是可重入锁,也会出现死锁publicclass......
  • java多线程:死锁
    一、死锁的定义   多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。   所谓死锁是指两个或两个以上的线程在......
  • MySQL 中的锁类型及死锁避免策略
    引言在数据库系统中,锁是一种重要的机制,用来管理并发访问数据的方式。在多个并发读写的事务同时操作数据库时,很容易出现资源争用的情况,这就需要使用锁来控制数据的访问权限,保证数据的一致性和完整性。MySQL是一款广泛使用的关系型数据库管理系统,它提供了多种不同的锁类型,用于不同......
  • 死锁相关问题
    什么是死锁死锁是指两个(或多个)线程相互等待对方数据的过程,死锁的产生会导致程序卡死,不解锁程序将永远无法进行下去。资源大部分的死锁都和资源有关,在进程对设备、文件具有独占性(排他性)时会产生死锁。把这类需要排他性使用的对象称为资(resource)。资源主要分为可抢占资源和不......