Java死锁

news/2024/12/5 11:46:02/

一.死锁是什么?

死锁指两个或者两个以上的线程在执行过程中,去争夺同样一个共享资源,造成的相互等待的现象,如果没有外部干预,线程会一直阻塞,无法往下执行,这样一直处于相互等待资源的线程叫做死锁线程。

二.为什么会有死锁?(死锁发生的条件)

同时满足四个条件就会产生死锁。

(1)互斥条件:一个资源每次只能被一个线程使用。

(2)请求与保持条件:一个线程因为请求资源而阻塞时,对已经获得的资源保持不放。

(3)不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺。

(4)循环等待条件:若干线程之间形成一个头尾相接的循环等待资源的关系。

三.如何解决死锁问题

死锁发生后,只能通过人工干预来解决,比如重启服务或者杀死这个线程。所以只能在编码时避开可能出现死锁的问题,而按照死锁发生的四个条件,只用破坏其中的一种就能避免死锁的发生。其中互斥条件没有办法被破坏,因为互斥条件是互斥锁的基本约束,其他的三个条件都有办法破坏。

对于请求和保持条件:一次性申请所有的资源,就不存在锁等待。

对于不可剥夺条件:占用资源的线程在进一步申请其他资源的时候,如果申请不到,可以主动去释放它占有的资源。

对于循环等待条件:可以按序申请来预防,线程在申请资源时按照顺序资源,线性化来避免循环。

四.Java中简单的死锁demo

    // a对象public static Object a = new Object();// b对象public static Object b = new Object();public static void main(String[] args) {new Thread(() -> {// 获取对象a的锁System.out.println(Thread.currentThread().getName() + "请求" + a + "的锁");synchronized (a) {System.out.println(Thread.currentThread().getName() + "获取到" + a + "的锁");// 线程等待2stry {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 获取对象b的锁System.out.println(Thread.currentThread().getName() + "请求" + b + "的锁");synchronized (b) {System.out.println(Thread.currentThread().getName() + "获取到" + b + "的锁");}}}).start();new Thread(() -> {// 获取对象b的锁System.out.println(Thread.currentThread().getName() + "请求" + b + "的锁");synchronized (b) {System.out.println(Thread.currentThread().getName() + "获取到" + b + "的锁");// 线程等待2stry {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 获取对象a的锁System.out.println(Thread.currentThread().getName() + "请求" + a + "的锁");synchronized (a) {System.out.println(Thread.currentThread().getName() + "获取到" + a + "的锁");}}}).start();}

五.如何排查死锁问题

方法一:通过jps命令找到运行的Java线程id,再通过jstack命令查看线程是否有死锁

方法二: 通过jps命令找到运行的Java线程id,再通过jcmd命令查看线程是否有死锁

方法三:使用Java内置性能分析工具jconsole

 

 

jps:列出正在运行的虚拟机进程。

jcmd:列出当前运行的所有虚拟机。

jstack:生成当前时刻的虚拟机线程快照。

jmap:生成堆转储快照。

 


http://www.ppmy.cn/news/7948.html

相关文章

什么品牌的蓝牙耳机音质最好?高品质蓝牙耳机排行榜

近年来,大量的蓝牙耳机品牌厂商涌入市场,蓝牙耳机的需求不断提高,但质量一直是人们担心的问题,今天就为大家盘点几款当前音质表现不错的真无线蓝牙耳机。 一、南卡小音舱蓝牙耳机 发声单元:13.3mm 网友推荐系数&…

力扣(LeetCode)363. 矩形区域不超过 K 的最大数值和(2022.12.30)

给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一个数值和不超过 k 的矩形区域。 示例 1: 输入:matrix [[1,0,1],[0,-2,3]], k 2 输出:2 解释&…

UE4 SoundCue声音节点总结

最近撸了一下音效,做个总结Mark一下: 1.Cue文件:音频序列化文件,能够对多个音频文件进行排序、组合、淡入淡出等操作,做出新的音频文件 2.Cue文件中的“声音节点” 2.1按参数交叉淡化: 节点及参数详解&…

【数组】leetcode704.二分查找(C/C++/Java/Js)

leetcode704.二分查找1 题目2 思路2.1 二分法区间--左闭右闭写法2.2 二分法区间--左闭右开写法3 代码(均使用左闭右闭)3.1 Java版本3.2 C版本3.3 C版本3.4 JavaScript版本4 小结1 题目 给定一个 n 个元素有序的(升序)整型数组 nu…

【基础强训】day4

一、选择题 &#x1f308;第1题 有以下程序 #include<iostream> #include<cstdio> using namespace std; int main(){ int m0123, n123; printf("%o %o\n", m, n); return 0; } 程序运行后的输出结果是&#xff08;&#xff09; A 0123 0173 B 01…

vscode+opencv+mingw+cmake配置vscode下的opencv环境

目录介绍安装VsCode安装mingw安装cmake安装opencv&#xff0c;以及其扩展库 opencv_contrib安装python利用cmake生成opencv的Makefile文件cmake命令进行编译&#xff0c;安装配置opencv环境变量配置VSCODE测试DEMO介绍 参考链接&#xff1a;https://www.cnblogs.com/czlhxm/p/…

机器学习和深度学习的关系

机器学习和深度学习的关系 机器学习是一种实现人工智能的方法&#xff0c;深度学习是一种实现机器学习的技术 机器学习&#xff1a;使用算法来解析数据&#xff0c;从中学习&#xff0c;然后对真实世界中的时间做出决策和预测。比如&#xff0c;垃圾邮件检测&#xff0c;房价…

初探Lua脚本

1、什么是Lua Lua脚本是一个由C语言编写的小巧脚本语言&#xff0c;在所有脚本引擎中&#xff0c;Lua的速度是最快的。Lua的核心代码不过一万多行&#xff0c;因为是C语言编写的&#xff0c;因此Lua可以在几乎所有的操作系统和平台进行编译运行 2、Lua适用场景 1&#xff09;…