首页 > 其他分享 >什么是死锁 , 以及产生的原因详细介绍

什么是死锁 , 以及产生的原因详细介绍

时间:2024-07-20 12:28:34浏览次数:16  
标签:LockB lockB LockA flag 介绍 死锁 lockA 详细 public

死锁

一. 什么是死锁

指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁,

通俗的说死锁产生的原因主要是由于线程的相互等待 , 导致程序无法进行下去

二. 代码阐述

这里我们写一段代码对死锁进行描述, 阐述其中的原理

  1. LockA类 --> 设置线程

    public class LockA {
        public static LockA lockA = new LockA();
    }
    
    
  2. LockB类 --> 设置线程

    public class LockB {
        public static LockB lockB = new LockB();
    }
    
  3. DieLock类 --> 继承Runnable重写run方法

    public class DieLock implements Runnable{
        private boolean flag;
    
        public DieLock(boolean flag) {
            this.flag = flag;
        }
    
        @Override
        public void run() {
            if (flag){
                synchronized (LockA.lockA){
                    System.out.println("if...lockA");
                    synchronized (LockB.lockB){
                        System.out.println("if...lockB");
                    }
                }
            }else{
                synchronized (LockB.lockB){
                    System.out.println("else...lockB");
                    synchronized (LockA.lockA){
                        System.out.println("else...lockA");
                    }
                }
            }
        }
    }
    
    
  4. Test01类 --> 实现类

    public class Test01 {
        public static void main(String[] args) {
            DieLock dieLock1 = new DieLock(true);
            DieLock dieLock2 = new DieLock(false);
    
            new Thread(dieLock1).start();
            new Thread(dieLock2).start();
        }
    }
    
    

在这里插入图片描述

场景描述

假设有两个线程 Thread1Thread2,它们分别通过不同的构造函数参数初始化了 DieLock 对象:

  • Thread1 初始化了 DieLock 对象,其中 flagtrue
  • Thread2 初始化了 DieLock 对象,其中 flagfalse

执行流程

  1. Thread1 执行

    • 首先获取 LockA.lockA 锁。
    • 然后尝试获取 LockB.lockB 锁。
  2. Thread2 执行

    (几乎同时或稍后):

    • 首先获取 LockB.lockB 锁(因为 flagfalse)。
    • 然后尝试获取 LockA.lockA 锁。

死锁发生

  • Thread1 已经持有 LockA.lockA 锁,并正在等待 LockB.lockB 锁。
  • Thread2 已经持有 LockB.lockB 锁,并正在等待 LockA.lockA 锁。

由于两个线程都在等待对方释放它们需要的锁,它们都将无限期地等待下去,从而导致了死锁。

在这里由于synchronized 控制的是整个代码块 , 当程序执行完毕才会释放此时占有lockA锁

synchronized (LockA.lockA){
                System.out.println("if...lockA");
                synchronized (LockB.lockB){
                    System.out.println("if...lockB");
                }
            }

同理Thread2占有lockB锁 , 然而此时Thread1线程中LockA在等待LockB , Thread2线程中LockB 在等待LockA就会产生死锁

如果我们稍作修改 , 将Thread2 的第二层嵌套取消掉就会发现运行结果不一样了 , 死锁问题不会产生

此时Thread2在获得LockB之后运行完毕释放LockB , Thread1也能获取到LockB进而继续执行

public class DieLock implements Runnable{
    private boolean flag;

    public DieLock(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        if (flag){
            synchronized (LockA.lockA){
                System.out.println("if...lockA");
                synchronized (LockB.lockB){
                    System.out.println("if...lockB");
                }
            }
        }else{
            synchronized (LockB.lockB){
                System.out.println("else...lockB");
                
                }
            }
        }
    }
}

在这里插入图片描述

标签:LockB,lockB,LockA,flag,介绍,死锁,lockA,详细,public
From: https://blog.csdn.net/xiugtt6141121/article/details/140560012

相关文章

  • Linux系统安装的详细步骤详解
    在VM虚拟机上安装Linux系统全过程,闭眼跟着走就行!!!1、准备好VMwareWorestation虚拟机软件和Linux系统的映像文件2、点击创建新的虚拟机3、在新建虚拟机向导中,选择典型安装模式。典型安装模式可以通过几个简单的步骤快速安装虚拟机,更方便操作。点击下一步。4、在安装来源......
  • 超详细的MySQL基本使用教程(1) 黑马程序员javaweb学习笔记+练习(附带idea新版ui图形化页
    什么是数据库MySQL概述数据模型关系型数据库SQL简介小结DDL-数据库的设计数据库的常见操作选中该语句然后点运行就成功运行了可以直接用图形化界面进行操作跳转到控制台表的常见操作1.创建练习在db01中创建这张表其中comment是鼠标悬停在......
  • 安全模式介绍-1OO2、1OO1
    传感器评估传感器评估方式(Sensorevaluation)包含3种传感器评估类型,1oo1评估(loo1evaluation),loo2评估-对等(1oo2evaluation,equivalent)和loo2评估-非对等(loo2evaluation,non-equivalent),具体在“通道参数”中选择,如下所示。图1传感器评估方式选择 1oo1评估:使用一个输入通道,......
  • JAVA Math类详细介绍
    Math类常见方法:1)abs绝对值2)pow求幂3)ceil向上取整4)floor向下取整5)round四舍五入6)sqrt求开方7)random求随机数//思考:请写出获取a-b之间的一个随机整数,a,b均为整数?2-78)max求两个数的最大值9)min求两个数的最小值//1.abs绝对值intabs=Math.abs(-9);Sys......
  • 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍
    文章目录1.背景介绍2.功能定义3.功能原理4.传感器架构5.实际应用案例5.1典型场景1:前方车辆压线5.2典型场景2:相邻车道有大型车辆5.3典型场景3:它车近距离cutin6.总结与展望1.背景介绍随着汽车技术的发展,智能巡航辅助系统成为了现代车辆的一项重要功能。智......
  • 介绍一下我一直用的IDE-工具推荐
    小熊猫C++在Bing上可以搜到官网(第一个),不要在其他搜索殷勤搜下载链接:http://royqh.net/redpandacpp/download/如果不知道选哪个版本访问下面的链接,下面是小熊猫C++32位,带编译器的3.1版本安装程序(稳定版本)https://wwe.lanzoui.com/iSen921kndgb功能高级的gdb调试,编辑器可......
  • 如何利用谷歌日历(Google Calendar)高效时间管理「超详细版」
    前言接上篇,回顾点击进入:如何实现高效的时间管理?推荐两款你一定在用的软件如何实现高效的时间管理?推荐两款你一定在用的软件在这个快节奏的时代,时间管理对于提高工作效率和生活质量至关重要。谷歌日历(GoogleCalendar)是一个强大的时间管理工具,可以帮助你更好地规划和跟踪你......
  • 全网最详细保姆式讲解-汽车电子测试和认证标准科普解析(二)
    这些是汽车电子设备的常见电磁兼容性(EMC)和环境测试标准。以下是每个标准的简要说明:RE,CE(CISPR25,GB18655)RE(RadiatedEmission,辐射发射):测量设备辐射的电磁能量,防止其干扰其他电子设备。CE(ConductedEmission,传导发射):测量设备通过导线传导的电磁能量,防止其干扰......
  • 【简单介绍下DALL-E2,什么是DALL-E2?】
    ......
  • 【简单介绍ReALM,什么是ReALM?】
    ......