线程死锁

线程池自引发死锁 线程池自引发死锁 死锁是由许多线程锁定相同资源引起的 如果在该池中运行的任务内使用线程池,也会发生死锁 像RxJava / Reactor这样的现代图书馆也很容易受到影响 死锁是两个或多个线程正在等待彼此获取的资源的情况。例如,线程A等待lock1线程B锁定,而线程B等待lock2,由线程A锁定。在最坏的情况下,应用程序冻结无限期的时间。让我向您展示一个具体的例子。想象一下,有一个Lumberjack类可以保存对两个附件锁的引用: import com.google.common.colle 阅读详情

转载自:https://blog.youkuaiyun.com/kwinway/article/details/80099864

一、死锁

由于两个或者两个以上的(进程)去抢夺一份资源而造成阻塞的状态叫做死锁, 
如果出现了死锁,会造成线程的循环等待,如果没有外力的帮助,就会一直维持着某种状态

二、死锁的产生

死锁的产生有如下四个必要条件 
      1. 资源是互斥的,同一时刻只能有一个进程占有该资源 
      2. 资源的释放只能有该进程自己完成 
      3. 线程在获取到需要资源之前,不会释放已有资源 
      4. 存在这么一条循环等待的队列,线程T1,T2,T3…, Tn 
      T1持有自己的资源请求T2的资源,….Tn持有自己的资源请求T1的资源 

 多线程如果设计的不合理的话,很可能就会出现死锁.当两个或者多个线程同时想要去获取共享资源的锁时,但每个线程都要等其他线程把他们各自的锁给释放,才能继续运行,这就是死锁.出现死锁必须具备以下几点 
* 要有两个或两个以上的线程 
* 至少有两个共享资源的锁 
* 至少存在两个线程各自拥有一个锁 
* 现在这两个线程在等待获取彼此的锁,这就出现死锁了

 

三、处理死锁的方式

死锁的预防

其实死锁的4个发生条件都是必要条件,也就是说4个条件缺一不可,我们可以通过破坏其中任意一个条件来预防死锁。 

 1.破坏资源的互斥性

这是不可能滴,在访问临界资源时,至少要保证对资源的访问是互斥的,例如一台打印机在任意一时刻只能打印一个文件

2.破坏不可抢占的条件

允许其他资源对资源的抢夺 
方案 1.在该方案下,如果占有某些资源的进程在进一步申请资源被拒绝后,就必须释放原本占有的资源,如果有必要,则可以再次申请这些资源或者另外资源

方案 2. 如果一个进程请求当前被另一个进程占有的资源,则操作系统可以抢占另一个进程,要求它释放资源.当然这必须是在两个不同优先级的进程才能生效

3.破坏请求和保持条件

在系统中不允许进程在已获得某种资源的情况下,申请其他资源.即阻止进程在持有资源的同时申请资源

方案 1. 所有进程在运行之前,必须一次性地申请在整个运行过程中所需的全部资源,在运行期间不能申请资源,带来的问题是

a.假设一个进程需要多种类型的资源,其中只有一组不满足进程所需,其他资源也必须保持空闲状态,严重影响资源的利用率 
b.会使某些进程长期得不到资源而发生饥饿问题,例如解决哲学家就餐问题时,我那篇文章就采用的是此方案,每个哲学家同时申请两个筷子,否则就等待,有可能某些哲学家长期不能一次申请到两个筷子而饿死….

方案2 要求每个进程在申请资源时,同时放弃已占有的资源,即使可能该进程很快又需要此资源 
当然这中方案也不是完全可以避免死锁 假设两个哲学家两个筷子,每个哲学家都拿着一个筷子,在申请对方筷子时又释放掉自己的筷子,就会又陷入死锁

4.破坏循环等待条件

将系统中的所有资源统一编号,进程可在任何时刻提出申请资源,但申请必须按资源的顺序提出,例如 1只能申请2号的资源,2号不能申请1号的资源。

四、经典的银行家算法

有5个向量 
Max:表示线程对每类资源的最大需求量;

Allocation:表示系统给线程已分配每类资源的数目;

Need:表示线程还需各类资源数目;

Available:表示系统当前剩下的资源。

当一个线程发出request时,先看request[i]是否小于其需求need 如果小于则 
进入查看request是否小于当前系统剩余总量Available ,如果满足则 暂时修改当前工作状态

Max-=request

Allocation+=request

Need-=request

Available-=request

然后进行安全检测 : 
设置一个工作向量 work = 此刻的Available 
查看剩余的进程是否有仍未完成的资源 
finish = flase

而且其所需资源(Need) < work(当前肾剩余资源)

若找到就将资源费配给他

等它运行完毕后就会释放资源,此时 
work = 之前剩余的work + 此进程运行时的资源MAX

之后当所有 
finish = flase 的资源都可以获得所需资源而运行完 
则表示此次分配是安全的,就可以分配

若不能满足上述条件,则表明此次分配是不安全的 就撤回其申请.

五、安全算法的原因

本质: 当我给你这个进程分配资源以后

要保证我剩余的资源能够在 剩下的进程中周转开来

例如 给 1分配资源后 ,剩下3个进程都开始申请资源

假设剩下三个进程ID 为 A, B ,C

假设ABC三个人的状态都是flase 
给进程1分配资源后,剩余资源为 available 
一直轮询 ABC 剩下的资源你们谁能完全利用,完成你们的事情, 然后后把你们占有的所有资源都归回来

假设A 发现剩下的资源他可以利用, (need < available ) 
那么它干完事情后就把它资源全部归还

此时剩下的资源就是 available + alloctoin(A)

再去轮询 看剩下 B和C是否能够完成 他们的事情

当ABC都能完成他们的事情,那么给1分配他所需的资源才是合理的 (此时成为安全序列) 
因为总(存在一种分配方案使 ABC都可以完成任务的分配 ) 
若不满足以上的检查,分配出去以后就是不安全序列 ,有可能就会发生死锁

eg:

假如第一个进程获得 所需资源 后,释放的资源和剩余的资源加起来不能满足以后所有进程中任何一个的需求量 剩下所有进程都会去占有资源而无法运行完,就不会去释放资源, 
就会造成进程的死锁问题

雪莉果的Axure原型工厂vol.006 中继器应用(二)——多选穿梭框 如果你用axure有一段时间了,那么你很快就能琢磨出一个大体设计流程,比如加一个中间过度的元件,来储存需要穿梭的内容;但是如果你再想一想,就会发现,这样做,似乎只能解决单选,那么多选需要怎么操作呢? 这时候,中继器就会告诉你,我还能做的更多。 阅读详情

相关推荐

保姆级避坑指南:Mid-360雷达到手后,用livox_ros_driver2从接线到出点云的完整流程

本文提供Mid-360雷达到手后的完整使用指南,涵盖从硬件接线、网络配置到livox_ros_driver2驱动的安装与调试,帮助用户避开常见陷阱,实现点云数据的稳定输出与可视化。重点解析了配置文件的参数设置和点云格式选择,确保用户能够高效部署和使用Mid-360雷达。

weixin_30733003的博客 483

数据库锁机制的详细解释

T1: select * from table (请想象它需要执行1个小时之久,后面的sql语句请都这么想象) T2: update table set column1='hello' 过程: T1运行 (加共享锁) T2运行 If T1 还没执行完 T2等… else 锁被释放 T2执行 endif T2之所以要等,是因为T2在执行update前,试图对table表加一个排他锁, 而数据库规定同一资源上不能同时共存共享锁和排他锁。所以T2必须等T1 执行完,释放了共享锁,才能加上排他锁,然后才

weixin_45453982的博客 352

【LDLTS解析】从重叠峰到精准参数:拉普拉斯深能级瞬态光谱如何重塑半导体缺陷分析

本文深入解析了拉普拉斯深能级瞬态光谱(LDLTS)技术如何革新半导体缺陷分析。针对传统DLTS难以分辨重叠峰的痛点,LDLTS通过拉普拉斯逆变换对高精度电容瞬态曲线进行数学解卷积,成功分离发射率相近的缺陷信号,实现从模糊宽峰到精准独立峰的转变。该技术不仅大幅提升了缺陷激活能和捕获截面等关键参数的提取精度,更推动分析范式从经验拟合转向第一性原理,为先进半导体工艺开发与良率提升提供了强大的精准诊断工具。

weixin_29224309的博客 273

线程死锁的初步理解

public class DeadLockDemo { /** * 避免一个线程同时获得多个锁; * 避免一个线程在锁内部占有多个资源,尽量保证每个锁只占用一个资源; * 尝试使用定时锁,使用lock.tryLock(timeOut),当超时等待时当前线程不会阻塞; * 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况 ...

神道时空的博客 152

雷达气象学(8)——反射率因子图实战(强对流预警篇)

本文聚焦雷达反射率因子图在强对流预警中的实战应用,深入解析了柱状回波、有界弱回波区(BWER)、三体散射(TBSS)等关键回波结构特征,这些是识别超级单体风暴和大冰雹的核心“身份证”。文章强调从静态识别转向动态追踪与多源数据综合研判的思维转变,并提供了系统的实战分析流程与常见误区避坑指南,旨在提升对强对流天气的短临预警能力。

weixin_29213827的博客 485

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 382

操作系统世界漫游(三)死锁

操作系统世界漫游(三):死锁一:什么是死锁区分死锁、饥饿和死循环二:死锁产生的四个必要条件三:死锁的处理策略1. 预防死锁1.1破坏互斥条件1.2破坏不剥夺条件1.3破坏请求和保持条件1.4破坏循环等待条件2. 避免死锁2.1什么是安全序列与安全状态2.2银行家算法3. 死锁的检测和解除3.1死锁检测3.2死锁解除算法 一:什么是死锁 在并发环境下,各进程因竞争资源而造成的一种相互等待对方手里资源,导致各进程都阻塞,都无法向前推进的现象。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。 区分死

zhangchuanghz的博客 749

小米万兆路由器里的Docker安装可道云(Kodexplorer)私有网盘

小米2022年12月份发布了万兆路由器,里面可以使用Docker。 今天尝试在小米的万兆路由器里安装[可道云](http://kodcloud.com/)(Kodexplorer)私有网盘。

engchina的专栏 1万+

数据库并发操作下的:排他锁(X),共享锁(S),死锁,活锁

丢失数据修改:两个事务T1,T2读入同一数据并进行修改,但只能保存最后执行事务的修改结果所以第一个事务修改的结果就自动后一个事务被覆盖!!!读“脏”数据:产生原因:数据在执行修改操作!例:两个事务T1,T2,事务T1执行的功能是对某一数据进行修改,而事务T2在T1执行过程中读取该修改后数据(此时T1还未将数据写回数据库中),但因某些原因T1修改数据失败,数据回滚!造成T2读到的值与数据库中的不一致...

VarryTan的博客 5114

【unity实战】随机地下城生成3——设置人物移动脚本、动画的切换和摄像机的跟随(含源码)

给房间添加触发器碰撞体,用来判断角色是否进入房间切割人物图片,注意人物每个图片高度可能不同,所有我们需要把轴心调整到人物的底部把人物跑步图片的高度,统一调成20,下面镂空,达到跳跃的效果快速创造人物动画,以人物idle为例,我们选中所有的idle人物图片,拖拽至窗口,unity就会自动生成,并提示保存动画位置别忘记设置人物排序图层,运行人物就动起来了新增run动画设置人物碰撞体设置刚体将重力设置为0,持续人物移动和动画切换的代码设置摄像机跟随单例代码在room中调用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1051

组建高效AI开发团队:角色、技能与协作

在当今科技飞速发展的时代,人工智能(AI)已经成为各个领域的核心驱动力。组建高效的AI开发团队对于企业和科研机构来说至关重要,它能够推动创新、提高竞争力、实现业务目标。本文的目的在于为那些希望组建或优化AI开发团队的管理者、技术负责人以及相关从业者提供全面的指导。范围涵盖了团队角色的定义、所需技能的分析、团队协作的策略,以及实际项目中的应用和相关资源的推荐。本文将首先介绍AI开发团队的核心概念与联系,包括团队角色、技能和协作之间的关系。接着阐述核心算法原理和具体操作步骤,结合数学模型和公式进行详细讲解。

2502_91592937的博客 995

Java并发编程进阶——并发锁

1 JAVA 多线程锁介绍 1.1 悲观锁 定义:悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改(很悲观),所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于锁定状态。 悲观锁的实现:开发中常见的悲观锁实现往往依靠数据库提供的锁机制,即在数据库中,在对数据记录操作前给记录加排它锁。如果获取锁失败,则说明数据正在被其他线程修改,当前线程则等待或者抛出异常。如果获取锁成功,则对记录进行操作,然后提交事务后释放排它锁。 实例:Java 中的 synchronized 关键

行者无疆的博客 4723

(五)激光线扫描-位移台标定

线激光属于主动测量方式,但是由于线激光的特性,我们只能通过提取激光中心线获取这一条线上的高度信息,那么要进行三维重建的话,就需要通过平移或者是旋转的方式,来让线激光扫描被测物体的完整轮廓,也就是整个表面。激光线的密度越高还原出来的物体越细腻,但由于数据量大,也会导致速度变慢。下面以位移台为例讲解,如何标定位移台。

FlyWine的博客 2888

Java 线程死锁及如何避免死锁介绍

死锁是指两个或两个以上的线程在执行过程中,**因争夺资源而造成的互相等待**的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去,

weixin_46448719的博客 4821

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

什么是线程死锁以及如何避免死锁

认识线程死锁 多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止,最终导致死锁产生。 如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会因互相等待而进入死锁状态。 线程死锁示意图 下面通过一个例子来说明线程死锁,代码模拟了上图的死...

happyJared 3826

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

线程死锁是什么

线程死锁:两个或两个以上的线程在执行过程中同时被阻塞,它们中的某个或者全部都在等待某个资源被释放,由于线程被无限期的阻塞,系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程被称为线程死锁 如上图所示,线程A持有资源2,线程B持有资源1,它们都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状态 如果想要了解什么是线程阻塞的朋友,可以看我之前发的一篇线程的阻塞线程死锁示例代码如下: 线程 A 通过 synchronized (resource1) 获得 resource1 的监视器锁,然后通

Ai1114的博客 4万+

《菜鸟读并发》什么是线程死锁,怎么解决线程死锁

面试题 什么是线程死锁,? 产生死锁的四个必要条件? 解决线程死锁的办法是什么? 如何避免死锁? 什么是线程死锁? 首先是一个线程需要多把锁,并发的时候多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 如下图所示,线程 A 持有资源 2,线程 B 持有资源 1,他们同时都想申请对方的资源,所以这两个线程就会互相等待而进入死锁状...

qq_25843323的博客 3万+

线程死锁详细介绍

死锁是指两个或多个线程互相等待对方占用的资源,而永远无法继续执行下去的情形。更正式的说,死锁是在多线程环境中,多个线程因争夺系统资源而造成的一种互相等待的现象。若无外力干预,这些线程将永远处于等待状态,导致整个程序无法继续运行。

Flying_Fish_roe的博客 2059

原创|《菜鸟读并发》什么是线程死锁,怎么解决线程死锁

点击上方“码农进阶之路”,选择“设为星标”回复“面经”获取面试资料面试题什么是线程死锁,?产生死锁的四个必要条件?解决线程死锁的办法是什么?如何避免死锁?什么是线程死锁?首先是一个线程需...

二师兄撒欢之地 1万+

死锁-java线程死锁

死锁是计算机系统中一个常见的问题,它指的是两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

qq_34358193的博客 1578

线程死锁——死锁产生的条件

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于相互等待状态,若无外力作用,它们将无法继续执行下去。造成死锁的原因可以概括成三句话: 上面的程序就是一个典型死锁的例子,为了保证死锁发生的几率,我这里在获得锁之后睡眠了1s。线程1在获得A对象锁之后等了1s去尝试获取B对象锁,这时的;线程2在获得B对象锁之后等待1s去尝试获得A对象锁,这时的;就在它们彼此想获得对方的锁的时候,发生了,并且一直持续下去。 上面提到只有这四个条件都发生时才会出现死锁,那么意思就是说,只要我们破坏其中一个,

qq_43842093的博客 1544

线程池死锁

使用线程池的风险 死锁:虽然死锁可能发生在任何多线程程序中,但线程池引入了另一种死锁情况,其中所有正在执行的线程都在等待等待队列阻塞线程的结果,因为执行的线程不可用。 简言之:业务线程在占用了线程池内所有的资源后又向线程池提交了新的任务,并且要等这些任务完成后才释放资源,而这些新提交的任务根本就没机会被完成 线程泄漏:如果从池中删除线程以执行任务但在任务完成时未返回线程,则会发生线程泄漏。例...

weixin_30252155的博客 1809

线程死锁以及死锁解决的方法

线程死锁以及死锁解决的方法 目录 线程死锁以及死锁解决的方法 一、什么是死锁 二、死锁产生的条件 三、代码演示 1. 死锁产生 2.调整加锁顺序避免死锁产生 3. 加锁时限避免死锁产生 一、什么是死锁 死锁是在两个以及两个以上线程在执行的过程中,由于资源竞争而出现的一种阻塞现象,如果没有外力作用,将会持续下去。 二、死锁产生的条件 互斥条件:每个锁资源一次只能有...

搬砖刘疯狂 1389

如何避免线程死锁

线程死锁是一种特殊的竞争条件,指的是两个或多个线程因相互等待对方持有的资源而无法继续执行的情况。互斥条件:每个资源只能由一个线程占用。占有并等待条件:一个线程已经持有了至少一个资源,并且正在等待获取另一个被其他线程占用的资源。不可剥夺条件:线程已经持有的资源在未完成使用前,不能被其他线程强行剥夺。循环等待条件:存在一个线程循环等待的链,链中的每个线程都在等待另一个线程持有的资源。这四个条件同时满足时,就会发生死锁。避免嵌套锁:尽量减少使用嵌套锁,避免一个线程持有多个锁。使用固定的锁顺序。

Flying_Fish_roe的博客 1093
上一篇: 线程同步
下一篇: JSP生命周期
coder150806
博客等级 码龄8年 79粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值