关于死锁的一些基本知识

news2024/12/24 20:49:35

目录

死锁是什么?

死锁的三种经典情况

1.一个线程,一把锁,连续加锁两次,如果锁是不可重入锁就会死锁。

不可重入锁与可重入锁:

2.两个线程两把锁,t1和t2各自针对于锁A和锁B加锁,再尝试获取对方的锁。

3.多个线程,多把锁(相当于第二种的一般情况)

死锁的四个必要条件

1.互斥使用

2.不可抢占

3.请求和保持

4.循环等待

如何破除死锁 


死锁是什么?

死锁的定义:在并发计算中,死锁是一种 状态,在这种状态下,组中的每个成员等待另一个成员(包括自己)采取行动,例如发送消息或更常见的释放锁。
首先关于死锁,如果存在两个线程:线程1与线程2。
线程1持有锁1,线程2持有锁2。在这种情况下,如果线程1尝试获取锁2,同时线程2尝试获取锁1。那么线程1就要等线程2释放锁2才能获取到锁2,而线程2释放锁2的前提是线程2获取到了锁1。也就是说,线程1在等待线程2释放锁2,而线程2也在等待线程1释放锁1.在这种情况下,线程1与线程2对峙着,陷入死等的情况。也就是我们所说的死锁。

死锁的三种经典情况

1.一个线程,一把锁,连续加锁两次,如果锁是不可重入锁就会死锁。

在这里涉及到一个概念:不可重入锁。那么什么是不可重入锁?什么是可重入锁?(此处仅为简单介绍,后续会单独介绍不可重入锁和可重入锁)
不可重入锁:
一个线程在第一次加锁后没有释放锁,然后又尝试再次的加锁。
但是此时第一个锁没有被释放,那么第二个锁只能阻塞等待,直到第一次加的锁被释放出来。此时会出现死锁问题。
可重入锁:
可重入锁在第一次加锁后再进行第二次加锁不会出现死锁问题。
一个线程针对于同一个对象连续加锁两次,若会存在问题则是不可重入锁。不会存在问题则是可重入锁。

2.两个线程两把锁,t1和t2各自针对于锁A和锁B加锁,再尝试获取对方的锁。

3.多个线程,多把锁(相当于第二种的一般情况)

经典案例: 哲学家就餐问题。
哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。每位哲学家面前都有一份面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。这种情况 可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。即使没有死锁,也有可能发生资源耗尽。
所以这个时候我们就需要想办法来解决这些哲学家们就餐的问题。
我们在这里先讲述一个简单的解法: 首先我们先为这些哲学家们编上编号,再为这些餐叉编上编号。
先让其中4个哲学家进行用餐,那么一定有一位哲学家拿到两个餐叉,在0号哲学家用完餐后,释放这两个餐叉。接着1号哲学家拿起4,3号餐叉进行用餐,剩余的哲学家都如上述方法进行用餐。
如同上图所示。
那么如何保证4号哲学家拿不到他左侧的筷子呐?这个时候需要对其左侧的筷子进行加锁操作。

死锁的四个必要条件

提示一下:这四个必要条件 同时具备才会出现死锁。

1.互斥使用

线程1拿到了锁,线程2就要等着。

2.不可抢占

线程1拿到锁后,必须是由线程1主动释放,不能是线程2强行将锁拿到手。

3.请求和保持

线程1拿到锁A后,再尝试获取锁B,A这把锁还是继续保持着的(就像你谈了女朋友,然后在没有和现任分手的情况下又想和另外一个女孩子在一起)。

4.循环等待

线程1拿到锁A后,尝试再获取到锁B。线程2拿到锁B后,尝试再拿到锁A。然后就变成了线程1等待线程2释放锁B,线程2等待线程1释放锁A。

如何破除死锁 

由于死锁的四个必要条件中的前三个条件都是锁的基本特征没办法进行修改,所以我们只能从第4个条件入手进行突破。
那么就是说: 解决死锁最有效的办法就是破除循环等待。
而破除循环等待的办法是: 给锁加个编号,然后指定一个固定的顺序(如从小到大)来进行加锁。任意线程加多把锁的时候,都让线程遵守上述的顺序,此时循环等待就会被破除,死锁问题就会被解决。

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

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

相关文章

Redis 集群

文章目录一、集群简介二、Redis集群结构设计🍉2.1 数据存储设计🍉2.2 内部通信设计三、cluster 集群结构搭建🍓3-1 cluster配置 .conf🍓3-2 cluster 节点操作命令🍓3-3 redis-trib 命令🍓3-4 搭建 3主3从结…

用ChatGPT生成Excel公式,太方便了

ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来,这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布,不少网友更是痴迷到通宵熬夜和它对话聊天,就为了探究 ChatGPT 的应用天花板在哪里,经过试探不少人发现&#xff0c…

同步和非同步整流DC/DC转换区别

在DC/DC转换器中,非隔离式降压开关稳压器包括两种拓扑结构:非同步整流(二极管)型和同步整流型。非同步整流型已经使用多年,具有简单的开关稳压器电路,效率勉强超过80%。随后,电池供电应用&#…

VMware 的网络适配器 桥接-NAT-仅主机

大家使用VMware安装镜像之后,是不是都会考虑虚拟机的镜像系统怎么连上网的,它的连接方式是什么,它ip是什么? 路由器、交换机和网卡 1.路由器 一般有几个功能,第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…

Redis 被问麻了...

Redis是面试中绕不过的槛,只要在简历中写了用过Redis,肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入,全面考察候选人对于Redis的掌握情况。 小张: 面试官,你好。我是来参加面试的。 …

Hadoop-MapReduce

Hadoop-MapReduce 文章目录Hadoop-MapReduce1 MapRedcue的介绍1.1 MapReduce定义1.2 MapReduce的思想1.3MapReduce优点1.4MapReduce的缺点1.5 MapReduce进程1.6 MapReduce-WordCount1.6.1 job的讲解2 Hadoop序列化2.1 序列化的定义2.2 hadoop序列化和java序列化的区别3 MapRedu…

RabbitMQ发布确认模式

目录 一、发布确认原理 二、发布确认的策略 (一)开启发布确认的方法 (二)单个确认模式 (三)批量确认模式 (四)异步确认模式 (五)如何处理异步未确认消…

华为CT6100双千M路由记录

该文章仅仅记录使用CT6100的流程,不提供任何参考和建议。 一、简介 设备:华为CT6100瘦客服端,J1800cpu,不包含外壳,有双千M网口,2G内存8G硬盘。系统:esir的高大全openwrt版本用途:对…

QT 完美实现圆形按钮

QT 版本:5.6.0 官方的按钮有些普通,如果我们想要换成自己喜欢的按钮而却无从下手,那么请继续往下阅读(皮一下)。 首先,可以在网络上搜索一下自己喜欢的按钮图形(或者可以自行绘制)…

十大算法基础——上(共有20道例题,大多数为简单题)

一、枚举&#xff08;Enumerate&#xff09;算法 定义&#xff1a;就是一个个举例出来&#xff0c;然后看看符不符合条件。 举例&#xff1a;一个数组中的数互不相同&#xff0c;求其中和为0的数对的个数。 for (int i 0; i < n; i)for (int j 0; j < i; j)if (a[i] …

偏向锁、轻量级锁、自旋锁、重量级锁,它们都是什么?有什么关联

互斥锁的本质是共享资源。 当有多个线程同时对一个资源进行操作时&#xff0c;为了线程安全&#xff0c;要对资源加锁。 更多基础内容参看上文《深入了解Java线程锁(一)》 接下来&#xff0c;我们来看看两个线程抢占重量级锁的情形&#xff1a; 上图讲述了两个线程ThreadA和…

SMART PLC斜坡函数功能块(梯形图代码)

斜坡函数Ramp的具体应用可以参看下面的文章链接: PID优化系列之给定值斜坡函数(PLC代码+Simulink仿真测试)_RXXW_Dor的博客-CSDN博客很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1…

vb.net 视频音频转换

视频&音频转换工具 V23.0主流视频音频转换工具&#xff0c;Kbps数值越大&#xff0c;音频品质越高&#xff08;前提原视频或音频文件品质高&#xff09;。.NETFramework V4.0点击按钮 选中文件 保存文件 即可转换&#xff0c;转换速度较快&#xff0c;转换后的音频文件未发…

Detr源码解读(mmdetection)

Detr源码解读(mmdetection) 1、原理简要介绍 整体流程&#xff1a; 在给定一张输入图像后&#xff0c;1&#xff09;特征向量提取&#xff1a; 首先经过ResNet提取图像的最后一层特征图F。注意此处仅仅用了一层特征图&#xff0c;是因为后续计算复杂度原因&#xff0c;另外&am…

使用kubeadm 部署kubernetes 1.26.1集群 Calico ToR配置

目录 机器信息 升级内核 系统配置 部署容器运行时Containerd 安装crictl客户端命令 配置服务器支持开启ipvs的前提条件 安装 kubeadm、kubelet 和 kubectl 初始化集群 &#xff08;master&#xff09; 安装CNI Calico 集群加入node节点 机器信息 主机名集群角色IP内…

DS期末复习卷(十)

一、选择题(24分) 1&#xff0e;下列程序段的时间复杂度为&#xff08; A &#xff09;。 i0&#xff0c;s0&#xff1b; while (s<n) {ssi&#xff1b;i&#xff1b;} (A) O(n^1/2) (B) O(n ^1/3) © O(n) (D) O(n ^2) 12…xn xn^1/2 2&#xff0e;设某链表中最常用的…

SnowFlake 雪花算法和原理(分布式 id 生成算法)

一、概述 SnowFlake 算法&#xff1a;是 Twitter 开源的分布式 id 生成算法。核心思想&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 id。算法原理最高位是符号位&#xff0c;始终为0&#xff0c;不可用。41位的时间序列&#xff0c;精确到毫秒级&#xff0c;41位…

Android 原生 TabLayout 使用全解析

前言为什么会有这篇文章呢&#xff0c;是因为之前关于TabLayout的使用陆陆续续也写了好几篇了&#xff0c;感觉比较分散&#xff0c;且不成体系&#xff0c;写这篇文章的目的就是希望能把各种效果的实现一次性讲齐&#xff0c;所以也有了标题的「看这篇就够了」。TabLayout作为…

【自然语言处理】Topic Coherence You Need to Know(主题连贯度详解)

Topic Coherence You Need to Know皮皮&#xff0c;京哥皮皮&#xff0c;京哥皮皮&#xff0c;京哥CommunicationUniversityofChinaCommunication\ University\ of\ ChinaCommunication University of China 在大多数关于主题建模的文章中&#xff0c;常用主题连贯度&#xff…

JSP实现数据传递与保存(一)

学习目标&#xff1a; 理解JSP内置对象的概念 掌握request和response的使用 掌握转发和重定向的区别 掌握out对象的使用 学习内容&#xff1a; 1.HTML页面转成JSP页面 HTML页面转成JSP页面一般有两种方式 方式1&#xff1a;直接修改HTML页面 1&#xff09;直接在HTM…