关于死锁的一些基本知识

news/2024/4/20 13:48:02/文章来源:https://blog.csdn.net/weixin_53212110/article/details/128505480

目录

死锁是什么?

死锁的三种经典情况

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.luyixian.cn/news_show_74093.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB-怎么将csv数据导入mongodb数据库的某张表中

背景介绍 背景就是开发突然问我能不能往数据库导数据,然后只需要某几列的数据。我的第一想法是:用python脚本读取csv文件,将内容拼接成json格式的文本,然后用脚本的方式导入。后来发现我用的GUI工具就可以直接导入数据到数据库中。…

OSS存储使用之centOS系统ossfs挂载

以CentOS7系统为例 下载CentOS系统支持的ossfs工具的版本,以下载CentOS 7.0 (x64)版本为例,可以通过wget命令进行安装包的下载 wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm 也可以通过yum命令来进行安装包的下载 sud…

操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! MSF和CS绕过UAC提权 CS绕过UAC提权 拿到一个普通管理员的SHELL,在CS中没有*号代表有…

排序基础之选择排序法

目录 前言 一、什么是选择排序 二、实现选择排序 三、使用泛型扩展 四、使用自定义类型测试 前言 今天天气不错,这么好的天气不干点啥实在是有点可惜了,于是乎,拿出键盘撸一把! 来,今天来学习一下排序算法中的选…

死磕Spring,什么是SPI机制,对SpringBoot自动装配有什么帮助

文章目录如果没时间看的话,在这里直接看总结一、Java SPI的概念和术语二、看看Java SPI是如何诞生的三、Java SPI应该如何应用四、从0开始,手撸一个SPI的应用实例五、SpringBoot自动装配六、Spring SPI机制与Spring Factories机制做对比七、这里是给我自…

你在公司混的差,可能和组织架构有关!

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,非公众号转载保留此声明。如果你接触过公司的面试工作,一定见过很多来自大公司的渣渣。这些人的薪资和职位,比你高出很多&#xff0…

利用steam搬砖信息差赚钱,单账号200+,小白也能轻松上手!

现在很多人在做互联网而且也赚到钱了,但还是有很多人赚不到钱,这是为什么? 这里我不得不说一个词叫做赛道,也就是选择,选择大于努力,项目本身大于一切,90%的人都觉得直播带货赚钱,但…

MySQL语法之DQL数据查询语言(数据库的查询)

Java知识点总结:想看的可以从这里进入 目录2.5.4、DQL数据查询1、简单查询2、模糊查询3、连表查询4、自连接5、UNION6、排序7、分页查询8、分组查询9、子查询in10、子查询EXISTS2.5.4、DQL数据查询 数据库的基本功能,对数据进行查询。关键字select&…

Python3+Selenium3自动化测试

此前对网页内容进行元素定位的操作,接下来就可以对已经定位的元素进行操作了,一般情况下定位好元素后通过IDE的提示就可以了解到有哪些方法 #coding utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By dr…

关于永中Office(永中办公软件)不认Windows系统安装的字体的解决办法

一位网友的电脑最近安装了永中Office软件,在使用过程中发现无法使用方正小标宋简体、仿宋GB2312等字体,这些字体在之前所用的微软Office中可以正常使用。他根据网上查到的一些的资料,将这些字体文件复制到C:\Program Files\Yozosoft\Yozo_Off…

【AcWing-Python-786】第k个数/快速选择算法

题目:https://www.acwing.com/problem/content/788/对应视频讲解:https://www.acwing.com/video/228/题目描述回顾快排【AcWing-Python-785】快速排序 - CSDN博客(一)步骤找到分界点x:可以是区间最左端点、区间最右端点…

华为OD机试用Python实现 -【天然蓄水库 or 天然蓄水池】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲天然蓄水库 or 天然蓄水池题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明示例三输入输出说明Python 代码实现算法思路华为OD机试300题大纲 参加华为

蓝桥2.24训练

1&#xff0c;奇怪的函数 P2759 奇怪的函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 1这道题有两个点&#xff0c;一个是求数的位数 2&#xff0c;用整数二分求出的位数与n比较 #include <bits/stdc.h> using namespace std; typedef long long ll; ll n; int ma…

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了&#xff0c;没点真本事真技术&#xff0c;没点面试经验&#xff0c;不了解点职场套路&#xff0c;如何过五关斩六将&#xff1f;如何打败面试官&#xff1f;如何拿下那梦寐以求的offer&#xff1f; 如果你的跳槽意向已经很确定&#xff0c;那么请往下…

Laravel框架01:composer和Laravel简介

Laravel框架01&#xff1a;composer和Laravel简介一、Composer介绍二、创建Laravel项目三、Laravel目录结构四、Laravel启动方式一、Composer介绍 composer 是PHP中用来管理依赖关系的工具。类似于Javascript的NPM。composer官网&#xff1a;https://getcomposer.org/安装结束…

Android源码分析 —— Activity栈管理(基于Android8)

0. 写在前面 本文基于 Android8.0源码&#xff0c;和Android9.0大同小异&#xff0c;但和Android10.0差别非常大&#xff01;新版改用ATM来管理Activity的启动&#xff0c;Activity的生命周期也通过XXXItem来管理。由于我分析的Activity启动流程就是基于Android8/9的&#xff…

通用信息抽取技术UIE产业案例解析,Prompt 范式落地经验分享!

想了解用户的评价究竟是“真心夸赞”还是“阴阳怪气”&#xff1f;想快速从多角色多事件的繁杂信息中剥茧抽丝提取核心内容&#xff1f;想通过聚合相似事件准确地归纳出特征标签&#xff1f;……想了解UIE技术在产业中的实战落地经验&#xff1f;通用信息抽取技术 UIE 产业案例…

啊哈 算法读书笔记 第 2 章 栈、队列、链表

第 2 章 栈、队列、链表 目录 第 2 章 栈、队列、链表 队列&#xff1a; 解密回文——栈 纸牌游戏&#xff1a; 链表 模拟链表 队列&#xff1a; 首先将第 1 个数删除&#xff0c;紧接着将第 2 个数放到这串数的末尾&#xff0c;再将第 3 个数删除并将第 4 个数放到这串…

Mysql 语句优化 (Explain)

Mysql 语句优化 &#xff08;Explain&#xff09; 1. 概述 ​ 在 select 语句之前增加 explain 关键字&#xff0c; mysql 会在查询上设置一个标记&#xff0c;返回查询执行计划信息&#xff0c;而不是执行这条sql 字段formatjson时的名称含义idselect_id该语句的唯一标识sel…

centos7安装

centos7安装制作U盘启动盘下载镜像下载 UltralISO制作启动盘使用U盘安装系统修改模式为 UEFI调整BOOT option保存重启进入安装界面安装图形界面安装搜狗输入法制作U盘启动盘 下载镜像 去官网下载镜像&#xff0c;找到 mirrors链接&#xff08;速度快&#xff09; 选择一个中…