Java线程死锁及解决方法

news2024/9/20 14:36:58

多线程环境下,死锁即两个或两个以上的线程去争夺同一个共享资源,而导致互相等待的情况。
在这里插入图片描述
要产生死锁,必须满足如下四个条件:

  1. 互斥条件,共享资源x和y只能被一个线程占有
  2. 请求和保持条件,T1持有x,并请求y,但不释放x
  3. 不可抢占条件,T1持有x,即使T2需要x,也不能强行从T1那里夺取x。资源不能被强行从持有它的线程中夺取,只有线程自愿释放它所持有的资源,其他线程才能获得这些资源。
  4. 循环等待条件,线程T1等到线程T2占用的资源,线程T2等到线程T1占用的资源,循环等待。

死锁已经产生,只能通过外部的干预来解决,比如重启或kill了线程。

出现死锁后,可以通过jstack命令去导出线程的dump日志,然后从dump日志中定位到具体的死锁程序代码。

实例:

  1. 使用jps找到java的pid
jps
12345 MyJavaApp
67890 Jps
  1. 使用jstack将输出重定向到文件
jstack 12345 > stack_trace.txt
  1. 使用cat查看输出文件
cat stack_trace.txt

"main" #1 prio=5 os_prio=0 tid=0x00007f8c5400b800 nid=0x1b03 waiting on condition [0x00007f8c5d1eb000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at MyJavaApp.main(MyJavaApp.java:15)

"Worker-1" #2 prio=5 os_prio=0 tid=0x00007f8c5400c800 nid=0x1b04 runnable [0x00007f8c5d3eb000]
   java.lang.Thread.State: RUNNABLE
    at MyJavaApp.doWork(MyJavaApp.java:30)
    at MyJavaApp.run(MyJavaApp.java:25)
    at java.lang.Thread.run(Thread.java:748)
  1. 分析上面的stack_trace.txt
    jstack 的输出会列出每个线程的堆栈信息,包括线程 ID、线程状态、锁信息等。示例如下:
"main" #1 prio=5 os_prio=0 tid=0x00007f8c5400b800 nid=0x1b03 waiting on condition [0x00007f8c5d1eb000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at MyJavaApp.main(MyJavaApp.java:15)

"Worker-1" #2 prio=5 os_prio=0 tid=0x00007f8c5400c800 nid=0x1b04 runnable [0x00007f8c5d3eb000]
   java.lang.Thread.State: RUNNABLE
    at MyJavaApp.doWork(MyJavaApp.java:30)
    at MyJavaApp.run(MyJavaApp.java:25)
    at java.lang.Thread.run(Thread.java:748)

“main” 和 “Worker-1”:线程的名称。
#1 和 #2:Java 线程 ID,这个 ID 是由 Java 虚拟机分配的,通常是一个递增的长整型值。Java 里的线程 ID 可以通过 Thread.getId() 获取,并与 jstack 输出中的 # 后的数字对应。
tid=0x00007f8c5400b800 和 tid=0x00007f8c5400c800:线程对象的内存地址。
nid=0x1b03 和 nid=0x1b04:本地线程 ID(Native Thread ID),由操作系统分配。jstack 输出中的 nid 字段即为本地线程 ID。它是用于操作系统级的线程管理和调度。nid,可以与操作系统级线程工具输出的 LWP 对应。
例如:
终端上使用命令

ps -L -p <pid>

输出:
PID   LWP TTY          TIME CMD
12345 12345 pts/0    00:00:00 java
12345 12346 pts/0    00:00:00 java
12345 12347 pts/0    00:00:00 java

LWP 是 Light Weight Process ID,对应于本地线程 ID(十进制形式)。要将 nid 与 LWP 对应起来,可以将十六进制的 nid 转换为十进制。例如,nid=0x1b03 转换为十进制是 6915。

也可以通过破坏死锁产生的四个条件:

  1. 互斥条件是锁本身的特征,无法被破坏
  2. 线程第一次执行时,一次性申请所有的共享资源来破坏请求和保持条件
  3. 占用部分共享资源的同时,在进一步申请其他资源的时候,如果申请不到就主动释放它已有的资源。破坏不可抢占条件。虽然看起来这种策略也破坏了请求和保持条件,但实际上,它是通过破坏不可抢占条件来间接打破请求和保持条件的。关键点在于,资源的释放行为不再仅仅由持有线程的意愿决定,而是受到资源分配策略的影响,这直接破坏了不可抢占条件。
  4. 给共享资源编号,线程按顺序去申请资源就可以破坏循环等待条件。

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

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

相关文章

7.9数据结构

思维导图 作业 doubleloop.h #ifndef __DOUBLELOOP_H__ #define __DOUBLELOOP_H__#include <stdio.h> #include <stdlib.h>typedef int datatype; typedef struct node {union{int len;datatype data;};struct node *pri;//前驱指针struct node *next;//后继指针…

Docker安装BRIA-RMBG-1.4模型,背景去除

目录 前言 模型描述 训练数据 定性评估 docker安装 运行 结论 Tip&#xff1a; 问题1&#xff1a; 问题2&#xff1a; 前言 BRIA 背景去除 v1.4 模型 RMBG v1.4 是我们最先进的背景去除模型&#xff0c;旨在有效地将各种类别和图像类型的前景与背景分开。该模型已在…

springboot会议室管理系统-计算机毕业设计源码50331

目 录 摘要 1 绪论 1.1 开发背景与意义 1.2国内外研究现状 1.3 相关技术、工具简介 1.3.1 MySQL数据库的介绍 1.3.2 B/S架构的介绍 1.3.3 Java语言 1.3.4 SpringBoot框架 1.4论文结构与章节安排 2 会议室管理系统需求分析 2.1 可行性分析 2.1.1 技术可行性分析 2…

昇思25天学习打卡营第21天|LSTM+CRF序列标注

1. 学习内容复盘 概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名…

一文实践强化学习训练游戏ai--doom枪战游戏实践

一文实践强化学习训练游戏ai–doom枪战游戏实践 上次文章写道下载doom的环境并尝试了简单的操作&#xff0c;这次让我们来进行对象化和训练、验证&#xff0c;如果你有基础&#xff0c;可以直接阅读本文&#xff0c;不然请你先阅读Doom基础知识&#xff0c;其中包含了下载、动作…

C++中的多重继承和虚继承:横向继承、纵向继承和联合继承;虚继承

多重继承 A.横向多重继承&#xff1a; B.纵向多重继承&#xff1a; C.联合多重继承&#xff1a; 因为 single 和 waiter 都继承了一个 worker 组件&#xff0c;因此 SingingWaiter 将包含两个 worker 组件&#xff0c;那么将派生类对象的地址赋给基类指针将出现二义性 那么如何…

AdaBoost集成学习算法理论解读以及公式为什么这么设计?

本文致力于阐述AdaBoost基本步骤涉及的每一个公式和公式为什么这么设计。 AdaBoost集成学习算法基本上遵从Boosting集成学习思想&#xff0c;通过不断迭代更新训练样本集的样本权重分布获得一组性能互补的弱学习器&#xff0c;然后通过加权投票等方式将这些弱学习器集成起来得到…

代码随想录——合并区间(Leecode LCR74)

题目链接 贪心 排序 class Solution {public int[][] merge(int[][] intervals) {ArrayList<int[]> res new ArrayList<>();// 先将数组按照左区间排序Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] intervals1, int[] in…

CentOS 7:停止更新后如何下载软件?

引言 CentOS 7 是一个广受欢迎的 Linux 发行版&#xff0c;它为企业和开发者提供了一个稳定、安全、且免费的操作系统环境。然而&#xff0c;随着时间的推移&#xff0c;CentOS 7 的官方支持已经进入了维护阶段&#xff0c;这意味着它将不再收到常规的更新和新功能&#xff0c;…

第241题| 确定极限中参数问题 | 武忠祥老师每日一题

解题思路&#xff1a;确定极限中的参数的方法是求这个极限&#xff1b;求极限根据类型选方法。 形可以用到三种方法&#xff1a;洛必达&#xff0c;等价&#xff0c;泰勒。 先观察题目&#xff0c;将看成一个整体&#xff0c;同时,并令,整理之后如下&#xff1a; 这里也要想办…

MySQL架构优化及SQL优化

变更项目的整体架构是性能收益最大的方式。主要涉及两方面&#xff0c;一方面是从整个项目角度&#xff0c;引入一些中间件优化整体性能&#xff0c;另一方面是调整MySQL的部署架构&#xff0c;确保能承载更大的流量访问&#xff0c;提高数据层的整体吞吐。 1. 引入缓存中间件…

使用F1C200S从零制作掌机之USB游戏手柄

一、USB手柄 COIORVIS PC游戏手柄电脑USB FC模拟器经典游戏手柄 安卓手机有线连接单打格斗对打拳皇 经典有线手柄【黄色】 https://item.jd.com/10046453175183.html 插入USB即可自动识别。 # [ 1425.447643] usb 1-1: USB disconnect, device number 7 [ 1427.072155] usb …

方法引用 异常 file

目录 一.方法引用 1.方法引用概述 2.引用静态方法 3.引用成员方法 i.引用其他成员方法 ii.引用本类成员方法 iii.引用父类成员方法 4.引用构造方法 5.其他调用方式 i.使用类名引用成员方法 ii.引用数组的构造方法 二、异常 1.异常的作用 2.异常的处理方式 i.JVM…

Windows7彻底卸载mysql

1.控制面板卸载mysql 2.删除C:\Program Files\MySQL 3.删除C:\用户\Administrator\App Data\Roaming\MySQL”(App Data默认隐藏&#xff0c;需要在文件夹和搜索选项中勾选显示文件夹),为了删除的更彻底&#xff0c;可以直接在计算机全盘搜索MySQL关键字&#xff0c;将所有找到…

微信服务里底部的不常用功能如何优化的数据分析思路

图片.png 昨天下午茶时光&#xff0c;和闺蜜偶然聊起&#xff0c;其实在微信服务底部&#xff0c;有很多被我们忽略遗忘&#xff0c;很少点过用过的功能服务&#xff0c;往往进入服务只为了收付款或进入钱包&#xff0c;用完就走了&#xff0c;很少拉到底部&#xff0c;看到和用…

STM32的SPI接口详解

目录 1.SPI简介 2.SPI工作原理 3.SPI时序 3.1 CPOL&#xff08;Clock Polarity&#xff0c;时钟极性&#xff09;&#xff1a; 3.2 CPHA&#xff08;Clock Phase&#xff0c;时钟相位&#xff09;&#xff1a; 3.3 四种工作模式 4.相关代码 4.1使能片选信号 4.2使能通…

【WebGIS平台】传统聚落建筑科普数字化建模平台

基于上述概括出建筑单体的特征部件&#xff0c;本文利用互联网、三维建模和地理信息等技术设计了基于浏览器/服务器&#xff08;B/S&#xff09;的传统聚落建筑科普数字化平台。该平台不仅实现了对传统聚落建筑风貌从基础到复杂的数字化再现&#xff0c;允许用户轻松在线构建从…

谷粒商城-个人笔记(集群部署篇三)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

Spark实现电商消费者画像案例

作者/朱季谦 故事得从这一张图开始说起—— 可怜的打工人准备下班时&#xff0c;突然收到领导发来的一份电商消费者样本数据&#xff0c;数据内容是这样的—— 消费者姓名&#xff5c;年龄&#xff5c;性别&#xff5c;薪资&#xff5c;消费偏好&#xff5c;消费领域&#x…

Sentinel-1 Level 1数据处理的详细算法定义(二)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…