Arthas实战(4)- 线程死锁问题排查

一、 准备测试应用

  1. 新建一个 SpringBoot应用,写一段线程死锁的代码:
@GetMapping("/threadLock")
public void threadLock() {Thread thread1 = new Thread(() -> {synchronized (resource1) {System.out.println(Thread.currentThread().getName() + " got resource1 lock.");try {Thread.sleep(100); // 模拟工作时间,让死锁更容易观察到} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " trying to get resource2 lock.");synchronized (resource2) { // 尝试获取resource2的锁System.out.println(Thread.currentThread().getName() + " got resource2 lock.");}}}, "Thread 1");Thread thread2 = new Thread(() -> {synchronized (resource2) {System.out.println(Thread.currentThread().getName() + " got resource2 lock.");try {Thread.sleep(100); // 模拟工作时间} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " trying to get resource1 lock.");synchronized (resource1) { // 尝试获取resource1的锁System.out.println(Thread.currentThread().getName() + " got resource1 lock.");}}}, "Thread 2");thread1.start();thread2.start();
}

二、使用Arthas排查问题

  1. 启动 Arthas:
    java -jar arthas-boot.jar

  2. 查看总体使用情况:
    dashboard
    在这里插入图片描述
    可以看到已经有死锁线程了

  3. 查看总体线程使用情况:
    thread
    在这里插入图片描述BLOCKED线程数量:2,并且显示了具体的BLOCKED线程

  4. 定位死锁的位置:
    thread -b
    在这里插入图片描述

输出解释:

  • 线程信息:“Thread 2” 的ID为49,当前状态为BLOCKED(阻塞)。这意味着它正在等待获取某个对象锁。
  • 阻塞原因:“Thread 2” 被阻塞是因为需要获取的对象java.lang.Object@3123ca6c正被另一个线程所持有。
  • 锁持有者:该对象锁java.lang.Object@3123ca6c目前被"Thread 1"(ID为48)持有。
  • Thread 1的状态:虽然输出信息没有直接展示"Thread 1"的状态,但从上下文可以推断,“Thread 1” 正在持有对象锁java.lang.Object@281be373。
  • 相互阻塞:最关键的信息是指出"Thread 2"尝试获取的锁被"Thread 1"持有,同时说明"Thread 1"至少在某一点上也尝试获取"Thread 2"持有的锁(或者导致了其他形式的循环等待),从而形成了死锁。这里的“but blocks 1 other threads!”暗示了这种相互阻塞的关系。

到目前为止。基本已经定位到死锁的具体原因和位置了。

  1. 查看死锁线程详细信息:
    thread 49
    thread 48
    在这里插入图片描述

根据上面的信息,我们可以清晰地看到两个线程"Thread 1"和"Thread 2"都处于阻塞状态,形成了死锁:

  • Thread 2 (Id=49) 的状态是BLOCKED,它在JvmThreadController.java:86行尝试获取对象java.lang.Object@3123ca6c的锁,但这个锁正被"Thread 1"持有。
  • Thread 1 (Id=48) 的状态也是BLOCKED,它在JvmThreadController.java:71行尝试获取对象java.lang.Object@281be373的锁,而这个锁正被"Thread 2"持有。

这种相互等待对方释放锁的情形正是死锁的经典表现。每个线程都持有一个锁,并尝试获取对方的锁,导致双方都无法继续执行下去。

  • 线程1 在执行到JvmThreadController.java的第71行时阻塞,等待Object@281be373的锁。
  • 线程2 在执行到同文件的第86行时阻塞,等待Object@3123ca6c的锁。
  • 两个线程互相等待对方释放锁,形成了死锁。

解决这个问题的关键在于调整同步策略,避免循环等待条件的出现,例如通过确保所有线程以相同的顺序请求锁,或者减少锁的使用范围和时间,使用更高层次的并发控制结构等。

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

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

相关文章

Solution

(解决方案)可行性研究报告暨设计方案-zengwenfeng.doc 基本上都要300-500多页,大型【纯软件】,县级0-200万,市级项目500-1500万不等,省部级1000-10000万不等都有。本例为过往已完成项目案例目录结构。搞方案都要准备1-3个月呢。所…

房屋租赁管理小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,中介管理,房屋信息管理,房屋类型管理,租房订单管理,租房信息管理 微信端账号功能包括:系统首页,房屋信息&a…

极狐GitLab 将亮相2024空天信息大会暨数字地球生态峰会,携手中科星图赋能空天行业开发者

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…

Django文档简化版——Django快速入门——创建一个基本的投票应用程序

Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应(1)创建项目(2)用于开发的简易服务器(3)创建投票应用(4)编写第一个视图1、编写…

Qualcomm QCA206x EasyMesh For Ubuntu

1. 引言 关于EasyMesh概念我们这里就不再过多的赘述,此篇文档的目的是,让广大初学者,有一个很方便的平台进行EasyMesh的学习和测试。 2. X86 Ubuntu平台 2.1 硬件环境准备 备注:QCA206x WiFi module推荐使用移远的FC64E/FC66E。…

Mysql笔记-v2【7月5日更新】

零、 help、\h、? 调出帮助 mysql> \hFor information about MySQL products and services, visit:http://www.mysql.com/ For developer information, including the MySQL Reference Manual, visit:http://dev.mysql.com/ To buy MySQL Enterprise support, training, …

详解yolov5的网络结构

转载自文章 网络结构图(简易版和详细版) 此图是博主的老师,杜老师的图 网络框架介绍 前言: YOLOv5是一种基于轻量级卷积神经网络(CNN)的目标检测算法,整体可以分为三个部分, ba…

第十节:学习ConfigurationProperties类来配置pojo实体类参数(自学Spring boot 3.x的第二天)

大家好,我是网创有方 。这节记录下如何使用ConfigurationProperties来实现自动注入配置值。。实现将配置文件里的application.properties的参数赋值给实体类并且打印出来。 第一步:新建一个实体类WechatConfig package cn.wcyf.wcai.config;import org…

GISSERVER 管理器如何发布自定义地图网站

GISSERVER 管理器可以发布我们自己的地图网站,那么如何通过编程或自动生成的方式生成一个地图页面并将其用GISSERVER 管理器发布出来呢?在看本章之前希望您能了解一下WEBGIS的基本架构情况,对您理解本章内容及WEBGIS基本原理很有帮助&#xf…

java花店管理系统eclipse开发mysql数据库

1 绪论 1.1 系统开发目的 随着人们物质生活水平和经济水平的不断提高,室内绿化布置、家庭园艺装饰、礼仪鲜花等日益受到重视和青睐,以及送鲜花给亲朋好友来表达自己的情谊。传统的花店对于信息的管理的主要方式是基于文本、表格等纸质手工处理&#xf…

React Native 和 Flutter 的开发对比

React Native (RN) 和 Flutter 都是用于构建跨平台移动应用程序的流行框架。两者都具有各自的优势和劣势,选择哪个框架取决于您的具体需求和项目。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 以下是一些 RN 和 Flutter…

企业搭建知识库:解锁无限潜力的钥匙

在当今这个信息爆炸的时代,企业如何高效地管理、传播与利用知识,已成为衡量其竞争力的重要标尺。知识库,作为这一背景下的产物,正逐步成为企业不可或缺的数字资产。它不仅是一个自助式的数字门户,更是连接员工、客户与…

【产品经理】订单处理12-订单的取消与反取消

在电商ERP系统中,订单取消与反取消也是常见功能之一。 订单取消与反取消也是电商ERP系统的常见功能,本次主要讲解下订单取消与反取消的逻辑。 一、订单取消 在电商ERP系统中,订单取消一般由审单员操作,此类取消一般是由于上下游…

探寻操作系统文件名字符限制的规则和历史

引言 从最早的电脑系统到现代的操作系统,文件命名的规则一直在不断发展,这些规则体现了不同操作系统设计哲学的差异。作为开发者,了解这些差异和背后的历史渊源非常有价值,本文将详细探讨Windows、macOS和Linux三大主流操作系统在…

解决 npm intasll 安装报错 Error: EPERM: operation not permitted

Node.js安装及环境配置完成之后 npm install express -g 安装全局的模块报错提示没有权限operation not permitted mkdir 错误编号4048: 其原因是当前用户操作该目录权限不足,当以管理员身份运行cmd,再执行npm install express -g 是不会报权…

Windows 如何选择多个文件?连续选择和间隔选择都有方法

在我们使用电脑的时候可能会遇见需要选择多个文件的情况,这些文件可能是连续的也有可能是间隔开的,这时候你知道都有哪些方法可以帮助我们进行选择吗?下面就分情况总结了不同的选择多个文件的方法,接下来就一起来看一看。 连续多…

LLM 大模型企业应用实战(-“消灭”LLM幻觉的利器

大模型在一定程度上去改变了我们生活生工作的思考的方式,然后也越来越多的个人还有企业在思考如何将大模型去应用到更加实际的呃生产生活中去,希望大语言模型能够呃有一些更多企业级别生产落地的实践,然后去帮助我们解决一些业务上的问题。 …

react 项目中预防xss攻击的插件 dompurify

一、安装 $ yarn add dompurify $ yarn add --dev types/dompurify 二、使用 import DOMPurify from dompurify;// 1、处理: DOMPurify.sanitize(htmlContent)// 2、之后放进 dangerouslySetInnerHTML dangerouslySetInnerHTML{{ __html: cleanHTML }} 如&#…

大模型提示词工程和落地思考

本文是一篇内部的个人分享(已无敏感信息) ,目的是增加产品、开发同学对 LLM 的理解,以降低沟通中的阻力,更好推进落地。 以下经脱敏后的原文: 大模型并不神奇 很多人听到’大模型’这个词可能会觉得很神秘&#xff…

守护家庭的安全卫士:家用可燃气体探测器

在这个追求智能与安全并重的时代,每一个细微之处的防护都显得尤为重要,尤其是在我们最为依赖的家庭空间里。当谈及家居安全,燃气安全无疑占据着至关重要的位置。据统计,每年因燃气管老化、连接处松动等问题引发燃气泄漏的事故不在…