Java 死锁

目录:

  1. 什么是死锁?
  2. 死锁是怎么产生的?
  3. 怎么排查死锁?
  4. 死锁的预防
  5. 拓展:Java CPU 100%排查

一 什么是死锁?

注:线程和进程都可能会产生死锁,以下以线程为例

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,
若无外力作用,它们都将无法推进下去。
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程。

另一种定义:
集合中的每个线程都在等待只能由本集合内的其他线程才能引发的事件,那么该组线程是死锁的。

竞争的资源可以是:锁、网络连接、通知事件,磁盘、带宽,以及一切可以被称作“资源”的东西。

二 死锁是怎么产生的?

死锁的主要产生原因:

  1. 系统资源不足
  2. 进程/线程运行的顺序不当
  3. 资源分配不当

产生死锁的四个必要条件:

  1. 互斥条件:一个资源每次只能被一个线程使用
  2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
  3. 不剥夺条件:线程已获得的资源,在未使用完之前,不能强行剥夺
  4. 循环等待条件:若干进程之间形成一种头尾相连的循环等待资源关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会产生死锁

常见死锁
在这里插入图片描述

避免死锁的一个通用的经验法则是

当多个线程都要访问资源A、B、C时,保证使每个线程都按照同样的顺序去访问它们,
即:让所有线程按照同样的顺序获得一组锁

三、怎么排查死锁

首先,编写一个死锁程序:

public static void main(String[] args) {final Object a = new Object();final Object b = new Object();Thread threadA = new Thread(new Runnable() {public void run() {synchronized (a) {try {System.out.println("now i in threadA-locka");Thread.sleep(1000l);synchronized (b) {System.out.println("now i in threadA-lockb");}} catch (Exception e) {// ignore}}}});Thread threadB = new Thread(new Runnable() {public void run() {synchronized (b) {try {System.out.println("now i in threadB-lockb");Thread.sleep(1000l);synchronized (a) {System.out.println("now i in threadB-locka");}} catch (Exception e) {// ignore}}}});threadA.start();threadB.start();}

上面的代码执行后,就会出现死锁,排查方法如下:

方式1:使用jps + jstack

第一:在windons命令窗口,使用 jps -l 

死锁线程

第二:在windons命令窗口,使用 jstack -l 9004

检测出死锁
死锁信息如上图,结合代码看就可以找出原因了。

方式2:使用jconsole

在window打开 JConsole,JConsole是一个图形化的监控工具

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、死锁预防:

遇见问题,解决问题是一般人的思维。高手都是提前预见问题,并有效预防。

死锁的常见预防思路如下:

  1. 以确定的顺序获得锁
  2. 超时放弃

当使用synchronized关键字提供的内置锁时,只要线程没有获得锁,就会永远等待下去。
然而Lock接口提供了:

boolean tryLock(long time, TimeUnit unit) throws InterruptedException

该方法可以按照固定时间等待锁,所以线程可以在获取锁超时时,主动释放之前已经获得的所有的锁。

五、拓展:
Java CPU 100%排查

见:https://blog.csdn.net/u010648555/article/details/80721815

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

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

相关文章

.NET Core 微信小程序退款——(统一退款)

点击上方“dotNET名人堂”,选择“设为星标”用学习的姿态,步入工作的状态继上一篇".NET Core 微信小程序支付——(统一下单)后",本文将实现统一退款功能,能支付就应该能退款嘛,一般涉…

Mysql数据库锁机制

一:概念介绍 MySQL数据库锁管理机制: SQL层实现的锁机制    Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作。一种特别的meta-data元数据类型,…

干货|亲测有效的N倍学习效果笔记法

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「108」篇原创敬上大家好,我是Z哥。先祝大家中秋快乐。我猜你现在心情不错,毕竟小长假的第一天才开始,后面还有60个小时的假期&a…

.NET Core 3.0 可卸载程序集原理简析

文章转载授权级别:A 预计阅读时间:8分钟 损失发量:不好统计因为最近在群里被问到如何理解 .NET Core 3.0 可卸载程序集,所以就写了这篇简单的分析。因为时间实在很少,这篇文章只简单的罗列了相关的代码&…

.NetCore技术研究-ConfigurationManager在单元测试下的坑

最近在将原有代码迁移.NET Core, 代码的迁移基本很快,当然也遇到了不少坑,重构了不少,后续逐步总结分享给大家。今天总结分享一下ConfigurationManager遇到的一个问题。先说一下场景:迁移.NET Core后,已有的配置文件&a…

分析一次double强转float的翻车原因

人逢喜事精神爽,总算熬到下班撩~~正准备和同事打个招呼回家,被同事拖住问了.?‍♂️: 你们组做的那块代码,把double类型数据成float有问题啊?.?‍♀️: 嗯?不对是正常啊,float精度是没有double高,但float能保存到小数点后好多位,对我们来说完全够用了!?‍♂️: 不是啊,这不…

.NET Core 3.0之深入源码理解Host(二)

写在前面停了近一个月的技术博客,随着正式脱离996的魔窟,接下来也正式恢复了。本文从源码角度进一步讨论.NET Core 3.0 中关于Host扩展的一些技术点,主要内容是关于创建Long Run Program的创建与守护。关于Host,我们最容易想到的就…

dotNET Core实现分布式环境下的流水号唯一

业务背景在管理系统中,很多功能模块都会涉及到各种类型的编号,例如:流程编号、订单号、合同编号等等。编号各有各自的规则,但通常有一个流水号来确定编号的唯一性,保证流水号的唯一,在不同的环境中实现方式…

认证方案之初步认识JWT

前言:现在越来越多的项目或多或少会用到JWT,为什么会出现使用JWT这样的场景的呢?假设现在有一个APP,后台是分布式系统。APP的首页模块部署在上海机房的服务器上,子页面模块部署在深圳机房的服务器上。此时你从首页登录…

Java实现生产消费模型的5种方式

** 前言 ** 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储…

Leetcode 86. 分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head 1->4->3->2->5->2, x 3输出: 1->2->2->4->3->5题目分析…

深入理解 JVM Class文件格式(一)

** 一、JVM体系结构 ** ** 二、class格式文件概述 ** class文件是一种8位字节的二进制流文件, 各个数据项按顺序紧密的从前向后排列, 相邻的项之间没有间隙, 这样可以使得class文件非常紧凑, 体积轻巧, 可以被J…

深入理解 JVM Class文件格式(二)

** class文件中的特殊字符串 ** 特殊字符串是常量池中符号引用的一部分,包括三种: 类的全限定名, 字段和方法的描述符, 特殊方法的方法名。 下面我们就分别介绍这三种特殊字符串。 (1) 类的全限定名 在…

.NET框架之“小马过河”

.NET框架之“小马过河”有许多流行的 .NET框架,大家都觉得挺“重”,认为很麻烦,重量级,不如其它“轻量级”框架,从而不愿意使用。面对形形色色的框架发愁,笔者也曾发愁。但我发现只要敢于尝试,这…

深入理解 JVM Class文件格式(三)

** JVM常量池中各数据项类型详解 ** 关于常量池的大概内容, 已经在 深入理解 JVM Class文件格式(一) 中讲解过了, 这篇文章中还介绍了常量池中的11种数据类型。 本文的任务是详细讲解这11种数据类型, 深度剖析源文件…

深入理解 JVM Class文件格式(四)

(3)CONSTANT_Integer_info 一个常量池中的CONSTANT_Integer_info数据项, 可以看做是CONSTANT_Integer类型的一个实例。 它存储的是源文件中出现的int型数据的值。 同样, 作为常量池中的一种数据类型, 它的第一个字节也是一个tag值…

.Net Core中使用Quartz.Net Vue开即用的UI管理

Quartz.NETQuartz.Net 定制UI维护了常用作业添加、删除、修改、停止、启动功能,直接使用cron表达式设置作业执行间隔,有完整的日志记录。Quartz.NET是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统。Quartz.NET是一个…

深入理解 JVM Class文件格式(五)

(8) CONSTANT_Class_info 常量池中的一个CONSTANT_Class_info, 可以看做是CONSTANT_Class数据类型的一个实例。 他是对类或者接口的符号引用。 它描述的可以是当前类型的信息, 也可以描述对当前类的引用, 还可以描述对…

混沌工程详细介绍——Netflix持续交付实践探寻

内容来源:DevOps案例深度研究 – Netflix的文化与工程实践战队(本文只展示部分案例PPT及研究成果,更多细节请关注案例分享活动,及本公众号)。本案例内容贡献者:高金梅,李晓莉,潘雄鹰…

深入理解 JVM Class文件格式(六)

经过前几篇文章, 终于将常量池介绍完了, 之所以花这么大的功夫介绍常量池, 是因为对于理解class文件格式,常量池是必须要了解的, 因为class文件中其他地方,大量引用了常量池中的数据项。 对于还不了解常量池…