如何定位预防死锁

如何定位&预防死锁

什么是死锁?

简单来说就是并发环境下,两个或两个以上的线程互相等待资源,导致“永久阻塞”的现象

代码示例:

public class Main {private static Object resource1 = new Object();private static Object resource2 = new Object();public static void main(String[] args) {new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "获取resource1成功");try {Thread.sleep(3000);synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "获取resource2成功");}} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println("执行成功");}).start();new Thread(() -> {synchronized (resource2) {System.out.println(Thread.currentThread().getName() + "获取resource2成功");synchronized (resource1) {System.out.println(Thread.currentThread().getName() + "获取resource1成功");}}System.out.println("执行成功");}).start();}
}

运行结果

在这里插入图片描述

代码解读:

  • 线程1先去获取到了resource1这个资源,睡眠了3000ms,可以理解为模拟一个重操作
  • 线程2在线程1睡眠的期间获取到了resource2这个资源,接着去尝试获取resource1资源,但是resource1被线程1所占有,导致了线程2的阻塞等待
  • 线程1在睡眠3000ms后,去尝试获取resource2资源,发现resource2已经被抢占了,于是也阻塞等待资源的释放
  • 最后,线程1和线程2都阻塞住了,也就是发生了“死锁”
怎么去定位死锁?
  1. 通过jps命令查看pid

在这里插入图片描述

  1. 不关闭死锁进程,打开终端输入jstack 死锁进程对应的pid

在这里插入图片描述

在这里插入图片描述

一旦线程发生了死锁,我们在线上一般没有办法进行有效解决,只能去进行程序的重启,不然会导致越来越多的线程堆积,从而出现OOM

所以应对死锁最好的方法就是尽量避免让程序出现死锁🐶

产生死锁的四大因素:
  • 互斥,共享资源同一时刻只能被一个线程占用
  • 占有并等待:线程在占有资源后,继续尝试占有其他线程正在占有的资源,造成当前线程等待
  • 不可抢占:线程占有的资源只能线程本身释放
  • 循环等待:两个线程互相等待资源的释放
如何避免死锁?

其实破坏死锁就是破坏构造死锁的四大因素之一就可以了

破坏互斥?

互斥性一般是比较难以破坏的,很多资源确实在同一时刻只用一个线程才能使用

破坏占有并等待?

诶,这个还真可以,既然线程存在因为资源获取不到而发生的阻塞等待行为,那么在线程首次执行前就把所有的资源都申请了不就行了,就能保证肯定有一个线程能够正常执行,前提是本身系统资源足以让一个线程执行完成

破坏不可抢占?

这个也可以,如果当前线程申请不到所要的资源,可以手动释放手里的资源,可以使用实现Lock接口的类,例如ReentrantLock的tryLock方法,可以传入锁的超时释放时间,一旦超过传入的超时时间当前线程就会自动释放手中的资源

破坏循环等待条件?

将资源从小到大编号,线程请求资源只能先请求编号较小的资源,线程2不再先去请求resource2,而是先去请求resource1,再去请求resource2;这样就不会导致死锁

总结

通过以上三种方式确实可以破坏死锁,但是会极大的抑制系统的性能

避免死锁算法

银行家算法

银行家算法的实质就是**要设法保证系统动态分配资源后不进入不安全状态,以避免可能产生的死锁。**即没当进程提出资源请求且系统的资源能够满足该请求时,系统将判断满足此次资源请求后系统状态是否安全,如果判断结果为安全,则给该进程分配资源,否则不分配资源,申请资源的进程将阻塞。

这里就不介绍了,可以看银行家算法

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

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

相关文章

达梦数据库自动备份(全库)+还原(全库) 控制台

一 前提 1.安装达梦数据库DB8(请参照以前文章) 我的数据库安装目录是 /app/dmDB8 2.已创建实例 (请参照上一篇文章) 二 准备测试数据 三 自动备份步骤 1.开启归档模式 开启DM管理工具管理控制台 弹不出来工具的 输入命令 xhost 第一步 将服务器转换为配置状态 右键-&g…

Kibana的安装(Linux版)

Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创…

汽车电子行业知识:智能汽车电子架构

文章目录 3.智能汽车电子架构3.1.汽车电子概念及发展3.2.汽车电子架构类型3.2.1.博世汽车电子架构3.2.2.联合电子未来汽车电子架构3.2.3.安波福汽车电子架构3.2.4.丰田汽车电子架构3.2.5.华为汽车电子架构 3.智能汽车电子架构 3.1.汽车电子概念及发展 汽车电子是车体汽车电子…

阿里云对象存储OSS入门

阅读目录 一、阿里云OSS的使用 1、OSS是什么?2、OSS的使用 二、阿里云OSS的使用三、图床的搭建四:图床绑定阿里云OSS 编写不易,如果我的文章对你有帮助的话,麻烦小伙伴还帮忙点个赞再走! 如果有小伙伴觉得写的啰嗦&am…

基于SIR模型的疫情发展趋势预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SIR模型的疫情发展趋势预测算法.对病例增长进行SIR模型拟合分析,并采用模型参数拟合结果对疫情防控力度进行比较。整体思路为采用SIR微分方程模型…

PC电脑技巧[笔记本通过网线访问设备CMW500]

笔记本局域网访问设备 现在我有一台CMW500,我要用笔记本去访问它,但是我发现没有路由器就是不能够访问,通过网线连接设备就是ping不通: 这里设置TCP/IPv4的IP地址如下,这时候就可以pin通了:

Aspose.PDF功能演示:在 JavaScript 中合并两个 PDF 文件

在 Web 应用程序的世界中,处理和操作文档是一项常见的要求。当谈到 PDF 文件时,开发人员经常发现自己需要将 PDF 合并为单个 PDF 文件。因此,在这篇博文中,我们将探索如何使用强大的 PDF 库在 JavaScript 中轻松合并两个 PDF 文件…

【学习】软件测试行业 ,有哪些以就业为主的学习侧重点

今天给所有入行软测的同学们,帮大家梳理下以就业为主的学习侧重点,简单来说就是【这些都是重点,圈起来,要考的】,有需要的小伙伴可以往下看。 建议一:一定要学习一门编程语言,再开始使用自动化测…

Qt Design Studio 软件怎么用(详细+通俗+有趣)

建议:本文长期更新,建议点赞/收藏! 1. 啥是Qt Design Studio? Qt Design Studio 是一个用于设计和开发用户界面的工具,特别适合开发跨平台应用程序。它结合了UI设计和开发的工作流程,使得设计师和开发者可…

[WTL/Win32]_[初级]_[如何设置ListView的列宽不出现水平滚动条]

场景 开发WTL/Win32的程序时,经常会用到表格控件CListViewCtrl。这个控件需要设置列的宽度,当用完100%的宽度来平均分配给列宽时,一加载数据多,就会出现垂直滚动条后,水平滚动条也会同时出现的问题。怎么设置才能让水…

搭建 Apple Mac M1 stm32 开发环境

近期想学习 stm32 开发,看了些书和视频,买了开发板。开发板到了后就迫不及待的的进行尝试。由于我目前使用的电脑是 Apple M1 Pro,目前用的比较多的是 windows + keil。我先是在 mac 使用虚拟机,安装 win 环境来使用,但是我分别使用了 VMware 和 parallels desktop ,keil…

vue3:通过【自定义指令】实现自定义的不同样式的tooltip

一、效果展示 vue3自定义不同样式的tooltip 二、实现思路 1.ts文件 在ts文件中创建一个全局容器 import一个容器组件,用于存放自定义的各式组件 创建一个指令并获取到指令传递的数据,并为容器组件传值 2.容器组件 用于存放自定义Tooltip样式的组件…

VGG16神经网络搭建

一、定义提取特征网络结构 将要实现的神经网络参数存放在列表中,方便使用。 数字代表卷积核的个数,字符代表池化层的结构 cfgs {"vgg11": [64, M, 128, M, 256, 256, M, 512, 512, M, 512, 512, M],VGG13: [64, 64, M, 128, 128, M, 256, …

【JS】深度学习JavaScript

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【JS】深度学习JavaScript 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 一:JavaScript1.1 JavaScript是什么1.2 JS的引入方式1.3 JS变量1.4 数据类型1.5 …

电脑桌面记事本便签软件,电脑记事本app

在快节奏的生活和工作中,我们时常需要记录一些待办事项、重要信息或是灵光一现的创意。这时,一款好用的电脑桌面记事本便签软件显得尤为重要。今天,我要为大家推荐的这款电脑桌面记事本便签软件,就是集齐简单、实用、高效于一身的…

MySQL高阶语句(一)

一、常用查询 (增、删、改、查) 对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等 1、按关键字排序 PS:类比于windows 任务管理器 使用 SELECT 语…

STM32之HAL开发——DMA转运串口数据

DMA功能框图(F1系列) 如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求, DMA 收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会…

动听的洗牌游戏(Java篇ArrayList实操)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

鸿蒙OS开发实例:【demo选择列表限定数量】

效果图: 示例代码 // 使用 DevEco Studio 3.1.1 Release 及以上版本,API 版本为 api 9 及以上。 // 主要功能及注意事项: // 该组件展示了一个乘客选择列表。列表中的每个项目包含一个复选框和对应的乘客姓名, // 用户点击任意一…

ubuntu20.04云服务器安装LXDE轻量级桌面和XRDP远程连接工具

云服务器一般都是安装命令行系统,用SSH连接,但是有时我们需要桌面来做更好的管理。 首先我们明确一下需要的东西。 一个桌面系统:LXDE(最轻量级桌面),为了节省资源,我们只要功能够用就行。一个…