Java线程死锁及解决方法

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

  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: RUNNABLEat 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: RUNNABLEat 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.mzph.cn/diannao/42873.shtml

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

相关文章

解读BASE理论:高可用性与性能的完美平衡

Base概念 BASE 理论是一种处理大规模分布式系统中的数据一致性问题的思路。相比于传统的严格一致性&#xff0c;它更灵活&#xff0c;适用于那些需要高可用性和性能的系统。BASE 理论由三个部分组成&#xff1a; 基本可用&#xff08;Basically Available&#xff09; 基本可用…

【c++刷题笔记-动态规划】day32: 509. 斐波那契数 、 70. 爬楼梯 、 746. 使用最小花费爬楼梯

509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int fib(int n) {if(n0){return 0;}vector<int>dp(n1);dp[0]0;dp[1]1;for(int i2;i<n;i){dp[i]dp[i-1]dp[i-2];}return dp[n];} }; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#x…

pytorch 模型保存到本地之后,如何继续训练

在 PyTorch 中&#xff0c;你可以通过以下步骤保存和加载模型&#xff0c;然后继续训练&#xff1a; 保存模型 通常有两种方式来保存模型&#xff1a; 保存整个模型&#xff08;包括网络结构、权重等&#xff09;&#xff1a; torch.save(model, model.pth) 只保存模型的state…

利用亚马逊云科技云原生Serverless代码托管服务开发OpenAI ChatGPT-4o应用

今天小李哥继续介绍国际上主流云计算平台亚马逊云科技AWS上的热门生成式AI应用开发架构。上次小李哥分享​了利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API​&#xff0c;这次我将介绍如何利用亚马逊的云原生服务Lambda调用OpenAI的最新模型ChatGPT 4o。…

CSAL: the Next-Gen Local Disks for the Cloud——论文泛读

EuroSys 2024 Paper 论文阅读笔记整理 问题 云本地磁盘以其实惠的价格和高性能而极具吸引力。在云本地磁盘中&#xff0c;物理存储设备直接连接到计算服务器&#xff0c;并作为块设备虚拟化到虚拟机&#xff08;VM&#xff09;。在这种设置下&#xff0c;计算节点受其有限的计…

纯前端如何实现Gif暂停、倍速播放

前言 GIF 我相信大家都不会陌生&#xff0c;由于它被广泛的支持&#xff0c;所以我们一般用它来做一些简单的动画效果。一般就是设计师弄好了之后&#xff0c;把文件发给我们。然后我们就直接这样使用&#xff1a; <img src"xxx.gif"/>这样就能播放一个 GIF …

MPC学习资料汇总

模型预测控制MPC学习资料汇总 需要的私信我~ 需要的私信我~ 需要的私信我~ 【01】课件内容 包含本号所有MPC课程的课件&#xff0c;以及相关MATLAB文档。 【02】课件源代码 本号所有MPC课程的源代码。 【03】MPC仿真案例 三个MPC大型仿真案例&#xff1a; 1&#xff09;…

Python面试题:在 Python 中如何进行多线程编程?

在 Python 中进行多线程编程通常使用 threading 模块。下面是一个简单的示例&#xff0c;展示了如何创建和启动多个线程。 示例代码 import threading import time# 定义一个简单的函数&#xff0c;它将在线程中运行 def print_numbers():for i in range(10):print(f"Nu…

链接器的工作原理,静态链接与动态链接的区别,如何创建和使用动态链接库

链接器在程序开发中的作用至关重要&#xff0c;它负责将多个目标文件和库文件整合成一个可以执行的文件。在深入了解链接器的工作原理、静态链接与动态链接的区别&#xff0c;以及如何创建和使用动态链接库之前&#xff0c;我们先来概述一下链接器的基本功能。 链接器的工作原…

20240704每日后端------聊聊 mybatis的 where 1=1

目标 最近&#xff0c;在项目中使用MyBatis进行SQL脚本编写时&#xff0c;我遇到了以“WHERE 11”开头的WHERE子句的做法&#xff0c;以简化多个条件的串联。这里有一个例子来讨论这种技术以及“WHERE 11”是否对性能有任何影响。 <select id"" parameterType&q…

【数据结构】09.树与二叉树

一、树的概念与结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 根结点&#xff1a;根…

04采访:数字人直播

​AI技术的迭代对数字人直播一定是有正向推动作用的。直播可持续性差,投入产出极不协调。不适合前期大量投入。直播现在这个东西有一个问题,因为直播开始带货了,就已经不是一个单纯的娱乐性质的视频内容,而是对带有一种商业目的内容。 直播带货的痛点:对主播而言是观众;…

俯卧撑计数器(Python)

通过 MediaPipe 检测人体姿态&#xff0c;计算俯卧撑角度和计数&#xff0c;并在图像上进行可视化展示 需要有cv2库和mediapipe库 mediapipe库&#xff1a; MediaPipe是Google开源的机器学习框架&#xff0c;用于构建实时音频、视频和多媒体处理应用程序。它提供了一组预训练的…

一文清晰了解HTML

有这样一个txt记事本文件和一张图片&#xff1a; txt文本内容是这样的&#xff1a; <html><head><title>HTML学习</title></head><body><h1>hello HTML</h1><img src"高清修复.png"/></body> </html…

LabVIEW的JKI State Machine

JKI State Machine是一种广泛使用的LabVIEW架构&#xff0c;由JKI公司开发。这种状态机架构在LabVIEW中提供了灵活、可扩展和高效的编程模式&#xff0c;适用于各种复杂的应用场景。JKI State Machine通过状态的定义和切换&#xff0c;实现了程序逻辑的清晰组织和管理&#xff…

VSCode工程中task.json的作用

在 Visual Studio Code&#xff08;VSCode&#xff09;中&#xff0c;tasks.json 文件是用来定义和配置任务&#xff08;Tasks&#xff09;的。任务指的是在开发过程中需要自动化执行的一系列操作&#xff0c;例如编译代码、运行测试、打包项目等。通过配置 tasks.json&#xf…

In Search of Lost Online Test-time Adaptation: A Survey--论文笔记

论文笔记 资料 1.代码地址 https://github.com/jo-wang/otta_vit_survey 2.论文地址 https://arxiv.org/abs/2310.20199 3.数据集地址 1论文摘要的翻译 本文介绍了在线测试时间适应(online test-time adaptation,OTTA)的全面调查&#xff0c;OTTA是一种专注于使机器学习…

【软件分享】我们都需要会用的ArcGIS10.8和ArcGIS Pro

ArcGIS是地理人必备的地理制图、空间分析常用的工具&#xff0c;读地理&#xff0c;或多或少都会接触到ArcGIS的使用&#xff0c;今天小编要带来的就是ArcGIS10.8软件资源和升级版ArcGIS Pro的软件资源。 软件安装包获取 公众号回复关键词&#xff1a;“ArcGIS"&#xff…

*算法训练(leetcode)第二十五天 | 134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列

刷题记录 134. 加油站135. 分发糖果860. 柠檬水找零406. 根据身高重建队列 134. 加油站 leetcode题目地址 记录全局剩余油量和当前剩余油量&#xff0c;当前剩余小于0时&#xff0c;其实位置是当前位置的后一个位置。若全局剩余油量为负&#xff0c;则说明整体油量不足以走完…

防爆手机终端安全管理平台

防爆手机终端安全管理平台能够满足国家能源、化工企业对安全生产信息化运行需求&#xff0c;能够快速搭建起高效、快捷的移动终端管理平台&#xff0c;提高企业安全生产管理水平&#xff0c;保证企业的安全运行和可持续发展。#防爆手机 #终端安全 #移动安全 能源、化工等生产单…