死锁的成因与解决方案

目录

死锁的概念与成因

栗子

死锁的情况

哲学家问题

如何避免死锁

必要条件

死锁的解决方案

总结


死锁的概念与成因

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

栗子

        我和美女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.xdnf.cn/news/1553374.html

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

相关文章

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

国庆刷题(day1)

C语言刷题: C刷题: 全对实在是太难了,我尽力了。。

野火STM32F103VET6指南者开发板入门笔记:【1】点亮RGB

硬件介绍 提示:本文是基于野火STM32F103指南者开发板所写例程,其他开发板请自行移植到自己的工程项目当中即可。 RGB-LEDPin引脚:低电平-点亮,高电平-熄灭REDPB5GREENPB0BLUEPB1 文章目录 硬件介绍软件介绍:结构体方式…

SQL Server中关于个性化需求批量删除表的做法

在实际开发中,我们常常会遇到需要批量删除表,且具有共同特征的情况,例如:找出表名中数字结尾的表之类的,本文我将以3中类似情况为例,来示范并解说此类需求如何完成: 第一种,批量删除…

leetcode_198_打家劫舍

思路:首先定义一个数组对于dp[i]读作1->i能获取的最大利益,第i个房屋只有"偷"和不"偷"两种情况,分别进行讨论 "偷": 既然"偷"了 i那就肯定不能偷i-1了,但是为了使"偷"的尽可能多除了必…

51单片机的串口

目录 一、串口的介绍 1、硬件电路 二、51单片机的UART 1、串口参数及时序图 2、串口模式图 3、串口和中断系统结构图 4、串口相关寄存器 三、串口向电脑发送数据 1、通过STC-ISP软件 四、电脑通过串口控制LED 1、主函数 2、 UART串口通信模块 一、串口的介绍 串口是一…

在Ubuntu 20.04中安装CARLA

0. 引言 CARLA (Car Learning to Act) 是一款开源自动驾驶模拟器,其支持自动驾驶系统全管线的开发、训练和验证(Development, Training, and Validation of autonomous driving systems)。Carla提供了丰富的数字资产,例如城市布局…

在 TextForm 字段后显示图标

问题 Expanded(child: Column(mainAxisAlignment: MainAxisAlignment.start,children: [SizedBox(height: 40),Row(children: [SizedBox(width: 8),//MENUIcon(Icons.menu,size: 34,color: AppColors.black,),Spacer(),//LOGOSizedBox(height: 60,width: 100,child: Image.ass…

Pikachu-xss实验案例-钓鱼

攻击思路:提供一个与攻击网站相似的登陆的钓鱼页面;让用户输入登陆信息 查看项目源代码,首先访问 fish.php ,提供输入的登陆框, 从登陆框获取到账号、密码后,重定向到xfish.php 做保存; 因此,需…

PCL 点云高斯滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 高斯滤波实现 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新&#xf…

HCIP-HarmonyOS Application Developer 习题(四)

1、以下哪个Harmonyos的AI能力可以提供文档翻拍过程中的辅助增强功能? A.文档检测矫正 B.通用文字识别 C.分词 D.图像超分辨率 答案:A 分析:文档校正提供了文档翻拍过程的辅助增强功能,包含两个子功能: 文档检测:能够…

好用的股票预测八大算法的Python实现

股票预测算法通常涉及时间序列分析、统计学、机器学习和深度学习等多种方法。以下是经典的、常见的十大股票预测算法及其Python实现。这些算法各有优势,可以用于不同的市场预测场景。以下代码实现中,我们将使用yfinance下载数据,并展示各算法…

关于鸿蒙next 调用系统权限麦克风

使用app的时候都清楚,想使用麦克风、摄像头,存储照片等,都需要调用系统的权限,没有手机操作系统权限你也使用不了app所提供的功能,虽然app可以正常打开,但是你需要的功能是没办法使用的。今天把自己在鸿蒙学…

netty之NettyServer字符串解码器

前言 在实际开发中,server端接收数据后我们希望他是一个字符串或者是一个对象类型,而不是字节码,那么; 在netty中是否可以自动的把接收的Bytebuf数据转String,不需要我手动处理? 答;有&#xff…

OpenGL ES MVP/变换投影矩阵(8)

OpenGL ES MVP/变换投影矩阵(8) 简述 通过前面几节的学习,目前我们已经可以渲染自己想要的图像,也可以通过纹理加载图片进行渲染。接下来我们来学习一下MVP,这里的MVP不是Android应用开发里的框架MVP,而是Model,View…

TCP/UDP初识

TCP是面向连接的、可靠的、基于字节流的传输层协议。 面向连接:一定是一对一连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息 可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端…

鸿蒙harmonyos next flutter混合开发之开发package

​​​​​​ 创建 package flutter create --templatepackage mypackage package代码如下: 创建hello_world.dart ///HelloWorld返回hello world 拼接param class HelloWorld {String helloWorld(String param) > "hello world ${param}"…

Java的学习(语法相关)

字符串存储的问题 char 和字符串都是字符的集合,它们之间的确有相似性,但在 Java 中它们有着不同的存储机制和处理方式。让我从 char 和 String 的本质区别入手来解释。 1. char 和 String 的区别 char 是基本类型:char 是 Java 中的基本数据…

现在别买理想L7/L8,问界M8要来暴揍友商了

文 | AUTO芯球 作者 | 雷慢 问界又一重磅炸弹要来了, 它就是问界M8, 来看,M8刚又曝光了大量谍照。 现在我打听的消息是这样的, 11月广州车展亮相预售, 12月底正式上市,25年春节前后开始交付&#xff…

TS(type,属性修饰符,抽象类,interface)一次性全部总结

目录 1.type 1.基本用法 2.联合类型 3.交叉类型 2.属性修饰符 1.public 属性修饰符 属性的简写形式 2.proteced 属性修饰符 3.private 属性修饰符 4.readonly 属性修饰符 3.抽象类 4.interface 1.定义类结构 2.定义对象结构 3.定义函数结构 4.接口之间的继…