Java并发之死锁详解

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨
👀👀👀 个人博客:小奥的博客
👍👍👍:个人CSDN
⭐️⭐️⭐️:传送门
🍹 本人24应届生一枚,技术和水平有限,如果文章中有不正确的内容,欢迎多多指正!
📜 欢迎点赞收藏关注哟! ❤️

文章目录

  • Java并发之死锁详解
  • 死锁
    • (1)概念
    • (2)产生死锁的条件
    • (3) 如何排查死锁
    • (4)如何预防和避免死锁
    • (5)死锁的检测
    • (6)死锁的解除

Java并发之死锁详解

死锁

(1)概念

① 进程死锁

指两个或者两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,由于这些进程都无法继续运行,导致没有一个进程可以被唤醒,就形成了进程死锁。

② 线程死锁

多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放,由于线程被无限期的阻塞,所以程序不可能正常终止,线程就会陷入互相等待的状态,就产生了线程死锁。

(2)产生死锁的条件

  • 互斥条件:当资源被一个线程占有时,其他线程不能使用
  • 请求和保持条件:当资源请求者在请求其他的资源的同时保持对原有资源的占用
  • 不可抢占条件:资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放
  • 循环等待条件:即存在一个等待的队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源,这就形成了一个等待环路

(3) 如何排查死锁

windows

我们首先使用Java的进程查看命令来查看Java进程运行的情况jps,如图

在这里插入图片描述

然后使用对应的PID去排查,使用的命令为jstack,控制台会给出死锁的详细信息。

在这里插入图片描述

Linux

Linux 下可以通过 top 先定位到 CPU 占用高的 Java 进程,再利用 top -Hp 进程id 来定位是哪个线程,最后再用 jstack <pid>的输出来看各个线程栈。

另外,还可以使用jconsole工具,在jdk\bin目录下。

(4)如何预防和避免死锁

预防死锁:破坏死锁产生的条件即可。

  • 互斥条件(不可改变):这个无法实现,因为我们使用锁就是为了使临界资源互斥的,不但不能改变,还得加入保证
  • 破坏请求与保持条件:
    • 方法一:开始运行前一次性申请所有需要的全部资源
      • 优点:简单容易实施且安全;
      • 缺点:资源被严重浪费,严重恶化了资源的利用率。因为某项资源不足,进程无法启动,而其他已经满足的资源也不会得到利用,严重减低了资源的利用率,造成资源浪费;使进程经常发生饥饿现象
    • 方法二:允许一个进程只获得运行初期所需的资源后,便开始运行,进程运行过程中再逐步释放已分配的且使用完毕的资源,然后再请求新的所需要的资源。
      • 优点:效率比较高,提高设备的利用率,减少发生线程饥饿的现象。
  • 破坏不可抢占条件:占用部分资源的线程进一步申请资源时,如果申请不到,可以主动释放它占有的资源
    • 当一个已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有的资源,待以后需要时重新申请。
    • 这种方法实现起来比较负责,且代价也会比较大。释放已经保存的资源可能会导致进程之间的工作失效,反复的申请和释放资源会导致进程被无限期的延迟,这不仅延长了进程的周转时间,而且也增加了系统的开销,降低了系统的吞吐量。
  • 破坏循环等待条件:依赖按照顺序来申请资源,释放资源则反序释放
    • 对系统所有资源类型进行线性排序,并赋予不同的序号。规定每个进程必须按递增的顺序请求资源。
    • 优点:资源利用率和系统吞吐量比前两种有较明显的改善。
    • 缺点:各类资源的序号必须稳定,这就限制了新类型设备的增加;可能在没有必要的情况下拒绝资源访问。

避免死锁

基本思想:系统对进程发出每一个系统都能满足的资源申请进行自动检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略。

  • 安全状态:指系统能够按照某种进程推进顺序为每个进程分配所需的资源,直至满足每个进程对资源的最大需求,使每个进程都能顺利的完成,此时的状态被称为安全状态。

  • 银行家算法:指在进程提出资源申请时先进行判断,资源分配之后是否会导致不安全状态,也就是产生死锁,如果会,则不分配,让线程继续阻塞等待,如果不会,则分配资源。

    按照银行家算法的思想,当进程请求资源时,系统将按照如下原则分配系统资源:

    • 当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该线程
    • 进程可以分期请求资源,请求资源的总数不能超过最大需求量
    • 系统现有的资源不能满足进程所需的资源时,对请求的资源可以请求推迟分配,但总能使进程在有限的时间里得到资源。
    • 当系统现有的资源能满足进程需要的资源时,必须测试系统现存的资源能否满足该进程尚需的最大资源数,若能满足则按当前的申请量分配资源,否则也要推迟分配。

(5)死锁的检测

为了能对系统中是否已经发生了死锁进行检测,在系统中必须保持:①保存有关资源的请求和分配信息 ②提供一种算法,利用这些信息检测系统是否已经进入死锁状态。

  • 资源分配图:由一组结点N和一组边E所组成的一个对偶G=(N,E)。把N分为两个互斥的子集,即一组进程结点p和一组资源结点R,凡是属于E中的边,分为资源请求边和资源分配边,代表进程请求一个资源或者将资源分配给某一个进程。
  • 死锁定理:如果资源分配图中没有环路,则说明系统中没有死锁;如果存在环路,则说明存在死锁。(S为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的,该充分条件被称为死锁定理)

(6)死锁的解除

  • 抢占资源:从一个或者多个进程中抢占足够多数量的资源,分配给线程死锁,以解除死锁状态。
  • 终止线程:终止系统中的一个或多个死锁进程,直至打破循环环路,是系统从死锁状态中解脱出来。

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

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

相关文章

拿捏c语言指针(中)

前言 书接上回 拿捏c语言指针&#xff08;上&#xff09; 此篇主要讲解的是指针与数组之间的爱恨情仇&#xff0c;跟着我的脚步一起来看看吧~ 创造不易&#xff0c;可以帮忙点点赞吗 如有差错&#xff0c;欢迎指出 理解数组名 数组名是首元素地址 例外 1.sizeof&#xff0…

【SQL注入】小白手把手入门SQL注入1-数据库基础

前言 本文以SQL注入为核心&#xff0c;讲解MySQL数据库的基本知识&#xff0c;和在SQL注入过程中可能会用到的部分重要语法。 什么是数据库 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…

【电路笔记】-感抗

感抗 文章目录 感抗1、概述2、感抗示例13、通过 LR 串联电路的交流电源4、感抗示例25、交流电感器的功率三角形线圈的感抗取决于所施加电压的频率,因为电抗与频率成正比。 1、概述 感抗是电感线圈的一种特性,它抵抗通过它的交流电 (AC) 的变化,类似于电阻中对抗直流电 (DC)…

LCR 127. 跳跃训练【简单】

LCR 127. 跳跃训练 题目描述&#xff1a; 今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有 num 个小格子&#xff0c;每次可以选择跳 一个格子 或者 两个格子。请返回在训练过程中&#xff0c;学员们共有多少种不同的跳跃方式。 结果可能过大&#xff0c;因此结果…

OpenAI超级视频模型Sora技术报告解读,虚拟世界涌现了

昨天白天&#xff0c;「现实不存在了」开始全网刷屏。 「我们这么快就步入下一个时代了&#xff1f;Sora简直太炸裂了」。 「这就是电影制作的未来」&#xff01; 谷歌的Gemini Pro 1.5还没出几个小时的风头&#xff0c;天一亮&#xff0c;全世界的聚光灯就集中在了OpenAI的So…

php 函数(方法)、日期函数、static关键字

php 函数、日期函数 1. php函数2. 日期函数3. static 1. php函数 函数是一段可重复使用的代码块&#xff0c;可以将一系列操作封装起来&#xff0c;使代码更加模块化、可维护和可重用&#xff0c;来大大节省我们的开发时间和代码量&#xff0c;提高编程效率。 <?php// …

基于SpringBoot+WebSocket+Spring Task的前后端分离外卖项目-订单管理(十七)

订单管理 1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 …

167基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序

基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序&#xff0c;可显示承载能力、压强、刚度及温升等图谱.程序已调通&#xff0c;可直接运行。 167 显示承载能力、压强、刚度及温升 (xiaohongshu.com)https://www.xiaohongshu.com/explore/65d212b200000000…

【uCore 操作系统】1. 应用程序与基本执行环境

文章目录 【 1. 代码框架简述 】1.1 OS 是怎么跑起来的&#xff1f;1.1.1 qemu 的作用1.1.2 rustsbi.bin 的作用 1.2 qemu 是怎么跑起来的&#xff1f;1.3 OS 文件夹1.3.1 kernel.ld1.3.2 entry.S1.3.3 main.c1.3.4 sbi.c 1.4 bootloader 文件夹 【 2. makefile 和 qemu 】2.1 …

测试架构师必备技能 —— Nginx安装部署实战

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的免费开源Web和 反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。在高并发访问的情况下&#xff0c;Nginx是Apache服务器不错的替代品。官网数据显示每秒TPS高达50W左右。本文…

基于51单片机的智能火灾报警系统的设计与实现

摘要:电子科技和城市建设的快速发展,电子设备产品使用频率和城市高层、地下以及大型综合性建筑修建的日益增多,在享受便捷生活的同时火灾隐患大大增加,一旦发生火灾,将带来严重危害。为预防火灾的发生,本文设计开发一种新型便捷智能火灾报警系统,由MCS-51 单片机、烟雾传…

C++学习—单例模式

目录 ​编辑 一&#xff0c;单例模式介绍 二&#xff0c;单例模式下的两种模式 1&#xff0c;饿汉模式 2&#xff0c;懒汉模式 一&#xff0c;单例模式介绍 单例&#xff1a;在全局只有一份实例。 单例模式是编程的经典模式之一。 二&#xff0c;单例模式下的两种模式 1&am…

面试:百度一面,吓尿了

公众号&#xff1a;程序员白特&#xff0c;可加前端技术交流群 前言 这是某211高校软件工程专业的师弟百度一面的题目和回答&#xff0c;全程高能&#xff0c;来看看你会多少~ 宇宙铁律&#xff0c;介绍下自己 还好&#xff0c;之前看到过敖丙大佬面试自我介绍5句话公式 - 掘…

C++6.0

思维导图 .编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a;比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0…

包教包会的Kotlin Flow教程

原文链接 包教包会的Kotlin Flow教程 公众号「稀有猿诉」 Kotlin中的Flow是专门用于处理异步数据流的API&#xff0c;是函数响应式编程范式(Functional Reactive Programming FRP)在Kotlin上的一个实现&#xff0c;并且深度融合了Kotlin的协程。是Kotlin中处理异步数据…

Springboot+vue的物流管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的物流管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的物流管理系统&#xff0c;采用M&#xff08;model&#xff09;…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…

四.Linux实用操作 12-14.环境变量文件的上传和下载压缩和解压

目录 四.Linux实用操作 12.环境变量 环境变量 环境变量--PATH $ 符号 自行设置环境变量 自定义环境变量PATH 总结 四.Linux实用操作 13.文件的上传和下载 上传&#xff0c;下载 rz&#xff0c;sz命令 四.Linux实用操作 14.压缩和解压 压缩格式 tar命令 tar命令压缩…

【C++初阶】deque容器的介绍以及为什么stack和queue选择deque的作为底层容器适配器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

STM32中断定时器的使用

使用systimer来产生较为精确的定时&#xff0c;之前使用for循环来产生。 用示例工程时产生错误&#xff0c;原因是调用F103的3种容量器件&#xff0c;需要更换S汇编头函数。 另外在工程设置中&#xff0c;需要把HD设置为MD&#xff0c;重新编译即可成功。