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

news2024/9/20 16:35:12

死锁

一. 什么是死锁

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

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

二. 代码阐述

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

  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");
                
                }
            }
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科技论文在线--适合练习期刊写作和快速发表科技成果论文投稿网站

中国科技论文在线这个平台可以作为练手的一个渠道,至少可以锻炼一下中文写作,或者写一些科研方向的简单综述性文章。当然,如果你的老师期末要求也是交一份科技论文在线的刊载证明的话,这篇文章可以给你提供一些经验。 中国科技论…

数据结构 - 队列(精简介绍)

文章目录 单端队列单端队列操作:Queue实现 双端队列双端队列操作:Deque实现 循环队列循环队列手动实现 优先级队列Q 不断取最大礼物并开方 单端队列 普通队列为单端队列,先进先出(FIFO) 只能从尾部插入,头…

jscolor 赋值input 没能引起前边色框的颜色变化

🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

操作系统内核源码杂谈篇:临界区

临界资源,是指同一时刻只能由一个线程(linux下为进程)访问的资源,而临界区就是为了确保临界资源访问是单一数据流。 临界区的代码执行,也就是进行原子操作,不会被打断。 先分析RTOS的运行架构&#xff0c…

35道最新【软件测试】面试题,常见面试题及答案汇总

前言 除了掌握扎实的专业技能之外,你还需要一份《软件测试面试宝典2024版》才能在万千面试者中杀出重围,成功拿下offer。 小编特意整理了35道测试必问必过面试题,送给大家,希望大家都能顺利通过面试,拿下高薪。赶紧码…

ngnix添加自定义模块

参考如下的 示例: hello handler 模块 部分, handler模块(100%) — Nginx开发从入门到精通 参考: 【Nginx】Nginx新增自定义模块_nginx 自定义模块-CSDN博客 需要详细说明的是, 创建一个addtion_module文件夹,将.c文件放进去&…

应急靶场(6):Linux1

目录 黑客的IP地址遗留下的三个flag 第一个flag第二个flag第三个flag 下载好靶场(应急响应靶机-Linux(1))并搭建好环境,使用帐号密码(defend / defend)登录靶机,然后使用su root命令和帐号密码(…

为hugo博客添加isso评论

个人博客评论诉求 能简单的在页面看到评论即可 能找到评论人的邮箱评论可以折叠能私有化部署 之前用过twikoo,个人体验没有isso丝滑简洁 私有化安装isso 官网 https://isso-comments.de/https://github.com/isso-comments/isso 部署方法 服务端安装python, pip 通过以下命…

“社群+”生态下的开源AI智能名片源码:驱动商业与社会连接的新引擎

摘要:在“社群”生态日益成为主流趋势的今天,开源AI智能名片源码作为技术创新与社群运营的深度融合体,正逐步展现出其重塑商业格局、深化社会连接的巨大潜力。本文旨在深入探讨开源AI智能名片源码的技术特性、在“社群”生态中的具体应用、对…

C/C++ yaml 库

文章目录 一、yaml 介绍1.1 yaml 介绍1.2 yaml 教程1.3 yaml 在线工具1.4 yaml 出现背景 二、C/C yaml 库选型2.2 libfyaml2.3 yaml-cpp 一、yaml 介绍 1.1 yaml 介绍 YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化格式,通…

在安卓手机上原生运行docker

前言 之前的文章(香橙派5plus上跑云手机方案一 redroid(带硬件加速))在Ubuntu的docker里运行安卓,这里说下怎么在安卓手机下运行docker,测试也可以跑Ubuntu。 想在手机上运行docker想的不是一天两天了,其实很久之前就有这个想法了&#xff…

12款超实用的视频压缩软件,帮你一键压缩视频

视频压缩软件这么多,我们该怎样正确使用它们并高效地压缩视频大小呢?数字化时代,高清画面的视频往往意味着更大的视频文件大小,它们往往会影响电脑占用内存、视频传输速度。本文将为您提供12款视频压缩技巧,帮您轻松将…

智能化革新:数字装备场的移动信息终端实战攻略!

智慧营区发展项目在数字化装备管理领域取得了显著进展,得益于物联网、大数据和人工智能等先进技术的融合应用,极大地增强了装备场所硬件之间的互动性和协同作业能力。 此外,该系统亦提供了定制化的在线业务流程管理服务,使得管理活…

小白新手搭建个人网盘

小白新手搭建个人网盘 序云服务器ECS重置密码远程连接ECS实例 安装OwnCloud安装Apache服务PHP运行环境NAS挂载挂载验证操作体验 序 阿里云文件存储NAS(Apsara File Storage NAS)是一个可大规模共享访问,弹性扩展的分布式文件系统。本文主要是…

3.4、matlab实现SGM/BM/SAD立体匹配算法计算视差图

1、matlab实现SGM/BM/SAD立体匹配算法计算视差图简介 SGM(Semi-Global Matching)、BM(Block Matching)和SAD(Sum of Absolute Differences)都是用于计算立体匹配(Stereo Matching)的…

什么是上网行为审计系统?有哪些功能?一文全搞定!

员工A(好奇地):“嘿,你听说了吗?公司最近要安装上网行为审计系统,说是要监控我们的上网行为。” 员工B(惊讶地):“真的吗?那岂不是很没有隐私?”…

xpeviewer.exe工具查看pe结构

1、下载地址 Releases horsicq/XPEViewer (github.com) 2、效果图

MATLAB R2023b下载安装教程汉化中文版设置

MATLAB R2023b下载安装教程汉化中文版设置 Matlab 是一款功能强大的商业数学软件 Matlab(Matrix Labortory)即矩阵实验室,它在数值计算、数据分析、算法开发、建模与仿真等众多领域都发挥着重要作用。 Matlab 具有以下显著特点和优势&…

力扣第十七题——电话号码的字母组合

内容介绍 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits "23" 输出…

关于Centos停更yum无法使用的解决方案

最近在使用Centos7.9系统时候,发现yum仓库无法进行安装软件包了,官方说2024年6月30日进行停更,停更后无法提供对应的软件服务。 我在使用yum安装包的时候发现确实不能使用官方服务了: CentOS停更的影响 CentOS停止更新之后&#…