资源、死锁、如何监测死锁

资源:变量、对象、网络资源、文件、内存、cpu等等

(应用层或者会话层 资源)

统一资源限定符:[scheme:][//authority][path][?query][#fragment]
authority 可以表示: [user-info@]host[:port]

比如:  file:F:\ideawork\client\pom.xml     (本地文件,中间的“\”符号要用File.separator  因为不同系统文件路径符号不同),网络文件就要服务器装ftp,超文本协议就可以用http://www.baidu.com

URI:对统一资源限定符进行封装,可以解析出相关内容信息

URL:  指向一个资源,然后可以拿网络连接、输入、输出流

比如:访问网站, openUrlConnection  拿到URLConnection  然后通过连接进行资源访问。

或者jdbc:mysql://192.168.43.3:3306/test  mysql数据库连接资源  ,他不能通过URL打开,只能通过DriverManager去拿连接(具体的Driver需要数据库厂商提供)。

(传输层网络资源)

socket 分为BIO (阻塞) NIO(异步,通过selector进行绑定);都需要设置超时时间(防止dos攻击)、窗口大小(太小了传输慢(一个周期内的数据量少),太大了占内存资源)等.

BIO   也就是对方不给你发消息,你线程就阻塞了,(socket.getinputstream.read)

注意区分:窗口大小和read里面接收的byte[] 不是一回事,窗口大小是设置网卡哪里的缓存大小,read里面的byte[]是你程序读取缓存的大小。

NIO 通过 selector监听已注册通道的状态(select方法),channel 进行selector注册,绑定一个参数(比如 服务通道绑定accpet)

死锁:线程a拿了A资源的锁,然后b线程拿了B资源的锁,再都没释放的情况下,a去申请B资源的锁,等待b线程释放,然后b线程去申请拿A资源的锁,等待a线程释放,此时就是死锁了

或者N个线程一起锁了,比如 a拿了A,b拿了B ,c拿了C,d拿了D,然后a申请B,b申请C,c申请D,d申请A, 造成死锁。

原理简单,把这个等待可以看成单链,因为每个线程只能等待一个资源,而资源又指向一个线程。类似单链

然后只要单链中有一个或者多个回路,也就是其中某个线程指向了他上层线程,那就完犊子了。

1.如何预防:资源锁顺序拿,比如A\B\C三个资源,a\b\c三个线程,然后a要拿A和B

b要拿B和C   c要拿C和A   ,只需要给资源排序,拿资源顺序必须按照 A\B\C的顺序拿

这时候c线程 是拿A和C  这时候A被锁了,等a线程;

然后 b线程完了之后,释放B和C资源,a线程继续跑,释放完A之后,c线程可以拿A和C执行了。

2.资源太多不好排序,那就资源分类, 比如 ABC 是一类  DEF 是一类,然后给类排序

然后按顺序拿类的锁,再去锁需要的单个或多个资源,然后释放类的锁。(类似于表级锁)

如果类也不好排序,那就直接一个大锁,拿完大锁,拿类锁,释放大锁,拿资源锁,释放类锁(类似于全局锁)

3.死锁检测:只能检测自己系统的,别人系统监测不了,所以调用别人系统的时候要设置超时时间,然后会有数据问题,就有了分布式事务以及最终一致性解决方案 以及定时任务调度。

监测:1.jvm工具,拉线程栈分析 不太会,后面再说。

2.程序自检

   1.自定义一个threadGroup 线程组,然后所有子线程都纳入这个线程组(子线程自己的线程组以及线程会自动纳入这里面的,他是树结构,禁止用反射使用私有构造方法新建threadGroup,不会被纳入进来)

  2.子线程再等待前记录blocker - (等待的资源 )(统一用底层是LockSupper实现的锁 - java自带的AQS) 不能用关键字锁,不会有blocker

3.每个线程定义一个栈,把已经拿到的锁资源压栈,目的:保证锁的顺序拿、顺序释放,要volatile修饰,保证线程可见,以及happen-before语义 保证 当时拿的是最新的。  

4.开启守护线程,循环监测threadGroup中等待线程的blocker,构建链表 、 查看是否有回路(有就进行中断操作 )不能使用stop, 不会释放锁资源

相关项目https://github.com/liukeling/Demos   后续再补充

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

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

相关文章

vue+springboot项目的登录验证码(JAVA自带)

后台springboot CaptureController package com.example.controller;import com.example.common.Result; import com.example.service.AuthCodeService; import com.example.utils.CodeUtils; import lombok.SneakyThrows; import org.apache.ibatis.annotations.Param; impo…

Java openrasp记录-01

例子1 https://github.com/anbai-inc/javaweb-expression 一个hook ognl、spel、MVEL表达式注入的例子 用的是asm5进行字节码修改 采用premain进行插桩,重写transform方法 expClassList是要hook的类,这里定义在MethodHookDesc 这里判断hook点通过类名…

Java并发编程:ThreadPoolExecutor详细源码解析与应用

Thread直接创建线程的弊端 在开始解析ThreadPoolExecutor类之前,让我们先来了解直接创建线程所带来的弊端。在Java中,线程是资源密集型对象,每当需要并发执行任务时,直接创建新线程会带来以下问题: 资源消耗 每个线…

贪吃蛇身子改进加贪吃蛇向右移动

1. 蛇移动的思想: 其实就是删除头节点 ,增加尾节点;一句代码搞定 struct Snake *p; p head; head head -> next; free(p) 防止造成多的空间节点 2.增加尾节点代码思想: 2.1 .开辟new 节点的空间 struct Snake *new (stru…

解决Android studio更换sdk地址后flutter项目显示no device selected

问题描述 因为之前sdk的路径在c盘上,经常在更新或下在sdk后c盘饱满,于是就更换了sdk的路径,更换sdk路径后就导致flutter项目在选择设备的时候出现no device selected 找不到设备,但是在device Manager可以看到物理设备或者是虚拟…

深入了解Eureka:微服务架构中的服务发现与注册中心

引言 微服务架构的兴起使得应用程序变得更加模块化和可扩展。在这种架构下,服务发现与注册中心扮演着至关重要的角色。本文将深入探讨Eureka作为服务发现与注册中心的作用、优缺点、重要性以及其服务架构。 一、Eureka的作用 Eureka是Netflix开源的一款用于构建分…

【Quartz】quartz集群模式下数据库表设计原则(详细版)

目录 引言 1. 数据共享性 2. 锁管理 3. 持久性和一致性 4. 状态追踪 5. 元数据管理 6. 优化和索引 主要的Quartz表包括 引言 Quartz 是一个流行的开源作业调度库,广泛用于在Java应用程序中安排作业。在Quartz的集群模式中,多个Quartz实例共享一个…

Java设计模式:使用责任链模式和状态模式优化‘审批流程‘

Java设计模式:使用责任链模式和状态模式优化审批流程 摘要引言 需求流程图正文内容📐 基本概念介绍 功能实现示例1:设计模式:责任链模式方法:好处: 示例2:设计模式:责任链模式方法和操作流程:好…

【canvas】前端创造的图片粒子动画效果:HTML5 Canvas 技术详解

前端创造的图片粒子动画效果:HTML5 Canvas 技术详解 我们将深入探讨如何通过 HTML5 的 Canvas 功能,将上传的图片转换成引人入胜的粒子动画效果。这种效果将图片分解成小粒子,并在用户与它们交互时产生动态变化。我们将分步骤详细解析代码&a…

EasyRecovery数据恢复软件2025永久免费电脑版下载

EasyRecovery数据恢复软件是一款业界知名的数据恢复工具,它凭借强大的恢复能力和广泛的数据兼容性,帮助用户从各种存储设备中恢复丢失或删除的数据。以下是关于EasyRecovery数据恢复软件的详细介绍。 EasyRecovery绿色破解下载网盘链接: https://pan.ba…

自动驾驶行业源代码防泄漏解决方案

行业背景: 随着新一代信息通信及人工智能技术的快速发展,汽车作为这些新技术应用的重要载体,正在加速向智能化和网联化转型,以自动驾驶研发为主业的企业也越来越多,如何保障自己研发的算法、模型、系统不被研发人员离…

Linux入门攻坚——20、systemd、(sysvinit、upstart重温)

再一次讲到Linux系统启动流程: POST --> Boot Sequence --> Bootloader(grub) --> kernel initramfs(initrd) --> rootfs --> /sbin/init 对于init,即系统内核加载完毕后(加载kernel和切换根文件系统)运行…

Python项目开发实战:怎么实现端口扫描器

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python项目开发实战_端口扫描器的实现_编程案例解析实例详解课程教程.pdf 1、步骤 在Python项目开发中,设计并实现一个端口扫描器是一项基础且实用的…

【WebRTC】【Unity】局域网UDP通信为何不通

【背景】 还是在研究Unity中实现VR桌面,希望能够通过UDP广播先找到所有活跃的Client。但是发现UDP广播并未能够成功传递给同一局域网正在运行的客户端。 【分析】 UDP信息在局域网不通可能有如下几个原因: 未连在同一个网段防火墙问题是否存在其它网…

STM32H750外设ADC之开始和结束数据转换功能

目录 概述 1 开始转换 1.1 使能ADSTART 1.2 使能JADSTART 1.3 ADSTART 通过硬件清零 2 转换时序 3 停止正在进行的转换( ADSTP、 JADSTP) 3.1 停止转换功能实现 3.2 停止转换流程图 概述 本文主要讲述了STM32H750外设ADC之开始和结束数据转换…

CentOS8/RHEL8 root密码破解

我们知道root是CentOS8/RHEL8系统的管理员用户,一般情况下,我们是不会把其密码忘记的,如果万一忘记了,如果破解root密码呢,今天就为大家详细讲讲。 1.CentOS8/RHEL8 root密码破解 1.默认安装及默认配置情况下&#x…

白杨SEO:2024年短视频怎么做?转型做抖音、快手、视频号等短视频流量难吗?怎么做更好?

短视频怎么做? 短视频怎么做?其实这是一个很宽泛的问题,就等同于赚钱怎么赚更多,一般是纯外行或者小白才会这么问。稍微懂一点会加一些前置或者后置条件, 比如: 抖音短视频流量怎么做? 抖音…

实践遥感场景目标检测,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建遥感场景下MSTAR数据基础上的目标检测识别系统

遥感相关的实践在我们前面的系列博文中也有相关的一些实践,基于MASTAR数据集开发构建对应的目标检测系统在前文也有一些介绍,感兴趣的话可以自行移步阅读即可: 《基于YOLOv7开发构建MSTAR雷达影像目标检测系统》 《基于yolov5n的轻量级MSTA…

前端开发攻略---用原生JS在网页中也能实现语音识别

1、语音识别的过程 语音识别涉及三个过程:首先,需要设备的麦克风接收这段语音;其次,语音识别服务器会根据一系列语法 (基本上,语法是你希望在具体的应用中能够识别出来的词汇) 来检查这段语音;最后&#xf…

Git操作与异常处理

文章目录 常用操作1、代码拉取2、代码提交3、暂存区状态4、提交代码5、推送远程仓库 异常处理【1】报错信息:Cannot pull into a repository with state: MERGING【2】报错信息:You have not concluded your merge (MERGE_HEAD exists)【3】报错信息&…