死锁的成因与解决方案

news2024/11/24 11:01:48

目录

死锁的概念与成因

栗子

死锁的情况

哲学家问题

如何避免死锁

必要条件

死锁的解决方案

总结


死锁的概念与成因

        多个线程同时被阻塞,他们中的其中一个或者全部都在等待某个资源的释放,导致线程无限期被阻塞,程序无法停止

栗子

        我和美女a出去吃饺子,吃饺子要醋和酱油

        我拿起醋他拿起了酱油

        我说: 把酱油给我我给你醋

        他说: 他醋给我我给你酱油

        结果两人争执不下谁也不让谁,就构成死锁,我两就是两个线程

死锁的情况

一线程一把锁

        可重入锁不会产生死锁,不可重入锁会发生(之前的文章有介绍过可重入锁)

两个线程两把锁

        是可重入锁也会发生死锁

N个线程,M把锁

        就更加容易发生死锁了

哲学家问题

        这就牵扯到哲学家就餐问题

如图 

        这五个哲学家,只会进行思考人生和吃饭

        思考人生放下筷子,吃饭就会拿起筷子,只有拿起两双筷子吃完才会放下

        如果只拿起一只,就会一直拿着不会放开

        假设五个哲学家每个人都拿起自己左手边的筷子,那就会永远发生阻塞,产生死锁

如何避免死锁

        先了解死锁的四个必要条件

必要条件

        1. 互斥使用. 一个线程拿到锁后,另一个线程无法使用

        2. 不可抢占. 一个线程拿到锁以后,只能自己主动释放,不能被其他线程抢占

        3. 请求与保持. 在资源请求者请求到其他资源的时候,同时保持对原有资源的抢占(吃着碗里的,看着锅里的)

        4. 循环等待. 存在一个等待队列 : p1 占用 p2 的资源, p2 占用着 p1 的资源,就形成了一个等待环路

如果上述条件都成立,那就会形成死锁.

但是如果打破其中一条就会使死锁消失

其中最容易破坏的就是循环等待

死锁的解决方案

        假设有 n 个线程想获取 m 把锁,我们规定一个所排序,比如(1,2,3,4.........)按照从小到大来进行获取锁,这样可以破坏环路,防止循环等待(可能很难理解,看一段代码就容易理解了)

        先看一段代码

    public static Object locker1 = new Object();
    public static Object locker2 = new Object();
    
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized(locker1){
                synchronized (locker2){
                    //工作
                }
            }
        });
        t1.start();
        Thread t2 = new Thread(() -> {
            synchronized(locker2){
                synchronized (locker1){
                    //工作
                }
            }
        });
        t2.start();
    }

        在这段代码中就会出现循环等待的情况

    public static Object locker1 = new Object();
    public static Object locker2 = new Object();
    
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized(locker1){
                synchronized (locker2){
                    //工作
                }
            }
        });
        t1.start();
        Thread t2 = new Thread(() -> {
            synchronized(locker1){
                synchronized (locker2){
                    //工作
                }
            }
        });
        t2.start();
    }

        只需要固定加锁的顺序,先获取到 1 才可以获取 2 ,这样就会破坏循环等待的情况

总结

        1. 死锁形成的四个条件

        2. 破坏循环等待是最常用的方法

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

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

相关文章

【EXCEL数据处理】000011 案列 EXCEL带有三角形图标的单元格转换,和文本日期格式转换。

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000011 案列 EXCEL带有三角形图标的单元格转换。使用…

Pikachu-csrf-CSRF(get)

登陆,修改个人信息;发现这是个get请求 把请求连接复制出来 ​http://192.168.3.224:8082/vul/csrf/csrfget/csrf_get_edit.php?sex1&phonenum1&add2&email3&submitsubmit就是 get请求的csrf 攻击payload

阿里云域名解析和备案

文章目录 1、域名解析2、新手引导3、ICP备案 1、域名解析 2、新手引导 3、ICP备案

重放Net-NTLM HASH 实验

先记录relay2SMB的,relay2LDAP的会补上来。 后面的一些利用EXCHANGE服务器的writedacl权限来relay2EWS DCSync的等我安了EXCHANGE再说吧2333。。 1. relay2SMB 0x01 smbrelayx.py 监听Net-NTLM,然后中继到win2008的SMB服务,执行whoami命…

CSS多列

CSS多列 前言 有的时候希望文本能按照多列效果显示,如: 这时候就要把文本显示效果改成多列显示,标题独占一行 CSS文本多列使用 ① column-count 指定文本分为几列,如: column-count: 3;② column-gap 指定列之…

微型导轨在IC制造设备的应用与优势

微型导轨的精度和稳定性对于机器的准确执行任务至关重要,其精确度通常用微米或毫米来衡量。其尺寸可以做到非常小,常运用在小型设备上,尤其是在IC制造设备中,其应用非常广泛。 在IC制造设备中主要用于半导体芯片的切割、封装和测试…

【C++】多态(下)

个人主页~ 多态(上)~ 多态 四、多态的原理1、虚表的存储位置2、多态的原理3、动态绑定和静态绑定 五、单继承和多继承关系的虚函数表1、单继承中的虚函数表2、多继承中的虚函数表 六、多态中的一些小tips 四、多态的原理 1、虚表的存储位置 class A {…

AIGC(AI网站分享)

博客C知道 人工智能(Artificial Intelligence,简称AI)是一门研究如何使机器能够像人一样思考和行动的科学。它涉及到模拟和复制人类智能的各个方面,包括学习、推理、问题解决、感知、原创性等。人工智能技术的发展使得计算机可以模拟人类的思维过程,并根据外界的输入做出相…

day02笔试练习

1.牛牛的快递 题目链接&#xff1a;牛牛的快递_牛客题霸_牛客网 public static void main(String[] args){Scanner in new Scanner(System.in);double a in.nextDouble();char c in.next().charAt(0);int ret 0;if(a < 1){ret 20;}if(a > 1){ret 20 (int) Math…

C++ | Leetcode C++题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfBoomerangs(vector<vector<int>> &points) {int ans 0;for (auto &p : points) {unordered_map<int, int> cnt;for (auto &q : points) {int dis (p[0] - q[0]) * (p…

波数k(空间中角频率的变化速度,即走多少长度,变化多少角频率)

K不是电磁波的移动速度&#xff0c;那个是相速度。 K是空间中角频率的变化速度&#xff0c;即走多少长度&#xff0c;变化多少角频率

第25天:web攻防-通用漏洞sql读写注入MYSQLMSSQL

#知识点&#xff1a; 1、sql注入-mysql数据库 2、sql注入-mssql数据库 3、sql注入-postgreSQL数据库 #详细点&#xff1a; Access无高权限注入点-只能猜解&#xff0c;还是暴力猜解 MYSQL&#xff0c;PostgreSQL&#xff0c;MSSQL高权限注入&#xff0c;可升级为读写执行。…

[C#]C# winform部署yolov11目标检测的onnx模型

【测试环境】 vs2019 netframework4.7.2 opencvsharp4.8.0 onnxruntime1.16.2 【效果展示】 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; usi…

自给自足:手搓了一个睡眠监测仪,用着怎么样?

很久不分享手搓党作品拉&#xff01; 今天分享一个“基于毫米波雷达的睡眠监测仪”作品&#xff01; 用Air700E开发板毫米波雷达&#xff0c;手搓一个开箱即用的睡眠监测仪&#xff0c;不花冤枉钱&#xff01; 来仔细瞧瞧&#xff01; 一、项目原理及硬件制作 毫米波是指频率…

1688商品API接口:电商数据自动化的新引擎

1688作为中国领先的B2B电子商务平台&#xff0c;为广大商家和制造商提供了一个展示和交易商品的广阔市场。随着1688商品API接口的推出&#xff0c;开发者和商家现在能够通过编程方式自动化获取和管理商品数据&#xff0c;极大地提高了工作效率和数据处理的灵活性。 一、1688商品…

(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第3关Git 基础知识

任务编号 任务名称 任务描述 1 破冰活动 提交一份自我介绍。 2 实践项目 创建并提交一个项目。 破冰活动 提交一份自我介绍。 每位参与者提交一份自我介绍。 提交地址&#xff1a;https://github.com/InternLM/Tutorial 的 camp3 分支&#xff5e; 安装并设置git 克隆仓库并…

解锁PDF阅读器的神奇功能与应用场景

PDF格式的文档因其稳定性、兼容性和安全性&#xff0c;成为了广泛传播和存储信息的重要载体。而PDF阅读器则是我们打开这个数字知识宝库的关键钥匙。接下来&#xff0c;让我们一同走进福昕PDF阅读器和它小伙伴们的世界&#xff0c;去探索它们的神奇之处。 1.福昕阅读器 链接一…

学校在线学习作业批改教学管理平台的设计与实现SpringBoot+VUE

目录 一、项目背景及目标 二、技术选型 三、系统功能模块设计 四、关键技术实现 五、总结 在当今社会上&#xff0c;随着社会的发展和进步&#xff0c;对于现代的学生来说网络课程已经广泛应用于学校的每个角落&#xff0c;而一个课程教学管理平台对于现如今的课堂是不可缺…

使用OneAPI+Ollama+Dify搭建一个兼容OpenAI的API发布及AI应用开发系统(二)客户端设置

这一编我们介绍Ollama客户端的设置&#xff0c;那么客户端在这里指的就是你放在家里的Ollama服务器&#xff0c;通过与VPS里安装的OneAPI配合&#xff0c;从而实现了为Ollama生成API访问的服务&#xff0c;并为后端服务器提供安全保障。 一&#xff1a;安装客户端软件 客户端…

ISA-95制造业中企业和控制系统的集成的国际标准-(5)

ISA-95 文章目录 ISA-95ISA-95与工业互联网一、工业互联网在哪里&#xff1f;二、维护自动化金字塔 ISA-95与工业互联网 ISA95作为指导性原则&#xff0c;自动化的阶段构建了以人和业务流程为中心的生产组织方式&#xff0c;极大的提高了生产的效率和灵活性&#xff0c;也满足…