相信程序员都会碰上这样的问题,Java死锁如何排查?又如何解决呢?那么,何为死锁呢?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。今天小编一次性来帮助大家解决Java死锁的有关问题。

1、为什么会出现死锁?

要解决Java死锁就必须追根究底,为什么会出现死锁?其实从死锁的定义就可以看出来,一方面是因为有两个或者两个以上进程,另一方面是因为有竞争资源。

2、怎么排查代码中出现了死锁?

(1)使用 jps + jstack

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

使用 jstack -l 12316

(2)使用jconsole

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

在windons命令窗口 ,输出JConsole

选择到线程的tab上

(3)使用Java Visual VM

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

在windons命令窗口 ,输出 jvisualvm

依然是切换到线程这个TAB上,很明显的就有提示!

3、如何避免死锁?

上面说了死锁出现的原因以及通过三种方式来检测和排查死锁,下面更重要的东西来了,就是如何避免死锁,如果能够让写出的代码避免死锁出现也就没有上面这些排查的过程了。最好的是从源头控制问题,而不是后期遇到问题在去填坑。

我看了阿里巴巴中最新的开发规约,里面有对避免死锁的说明,具体如下:

死锁的原因就是两个线程试图以不同的顺序来获得相同的锁。所以,如果所有的线程以固定的顺序来获得锁,那么在程序中就不会出现锁顺序死锁的问题。

(1)动态的锁顺序死锁

以一个经典的转账案例来进行说明,我们知道转账就是将资金从一个账户转入另一个账户。在开始转账之前,首先需要获得这两个账户对象得锁,以确保通过原子方式来更新两个账户中的余额,同时又不破坏一些不变形条件,例如 账户的余额不能为负数。

结论:由于我们无法控制transferMoney中的参数的顺序,而这些参数顺序取决于外部的输入。所以两个线程同时调用transferMoney,一个线程从X向Y转账,另一个线程从Y向X转账,那么就会发生互相等待锁的情况,导致死锁。

解决问题方案:定义锁的顺序,并且整个应用中都按照这个顺序来获取锁。

方案一:使用System.identityHashCode方法,该方法返回有Object.hashCode返回的值,此时可以通过某种任意方法来决定锁的顺序。但是在极少数情况下,两个对象可能拥有相同的散列值,在这种情况下,通过给公共变量加锁来实现给锁制定顺序。所以这种方法也是用最小的代价,换来了最大的安全性。

方案二:在Account中包含一个唯一的,不可变的,值。比如说账号等。通过对这个值对对象进行排序。

(2)在协作对象之间发生的死锁

如果在持有锁时调用某外部的方法,那么将出现活跃性问题。在这个外部方法中可能会获取其他的锁(这个可能产生死锁),或阻塞时间过长,导致其他线程无法及时获得当前持有的锁。

场景如下:Taxi代表出租车对象,包含当前位置和目的地。Dispatcher代表车队。当一个线程收到GPS更新事件时掉用setLocation,那么它首先更新出租车的位置,然后判断它是否到达目的地。如果已经到达,它会通知Dispatcher:它需要一个新的目的地。因为setLocation和notifyAvailable都是同步方法,因此掉用setLocation线程首先获取taxi的锁,然后在获取Dispatcher的锁。同样,掉用getImage的线程首先获取Dispatcher的锁,再获取每一个taxi的锁,这两个线程按照不同的顺序来获取锁,因此可能导致死锁。

解决方案:使用开放掉用。如果再调用某个方法时不需要持有锁,那么这种调用就被称为开放掉用。这种调用能有效的避免死锁,并且易于分析线程安全。

以上就是Java死锁的排查和解决方案,希望能够对大家有所帮助,强烈建议大家一定要在看完之后亲自去实践一下操作过程。千万别认为看懂了就行了,往往在实际操作中能学到更多的知识。

java排查死锁_Java死锁的排查和解决方案相关推荐

  1. java如何防止死锁_Java 死锁以及如何避免?

    Java中产生死锁的原因以及如何避免: 1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的 ...

  2. java 分析java死锁_Java死锁示例–如何分析死锁情况

    java 分析java死锁 死锁是两个线程或多个线程永远被阻塞的编程情况,这种情况发生在至少两个线程和两个或更多资源的情况下. 在这里,我编写了一个简单的程序,它将导致死锁情况,然后我们将看到如何对其 ...

  3. java 死锁_java死锁分析

    Java 的死锁分析 (*)JDK: 提供强大诊断工具:Thread Dump ----> 文本信息 (*)windows: ctrl+break /(fn+B) 打印锁信息 linux: ki ...

  4. java死锁_Java死锁原理,手写死锁,解决死锁

    死锁:多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个线程都在等在对方释放资源. 都停止的情形.某一个同步块同时拥有两个以上对象的锁时,就会产生死锁问题. 手写 ...

  5. java无响应_Java HttpClient请求无响应解决方案

    首先来看下多线程处理的流程: 在来看下:httpClient请求工具方法: public static String sendGetRequest(String reqURL, String deco ...

  6. java process 乱码_Java常见乱码原理及解决方案

    String odsStr = "测试"; String newStr = new String(odsStr.getBytes("GBK"), "I ...

  7. java dwr 漏洞_Java DWR内存泄漏问题解决方案

    机器跑了一晚上,发现有崩溃现象,由于页面内有动态绘图功能,我怀疑是绘图原因,但是今天上午有人提醒我才想到,是不是间隔调用时DWR产生了内存泄漏问题? 网上查了一下貌似大家都在讨论这个问题,之前我也挺老 ...

  8. java线程死锁 cpu 100%_Java死锁排查和Java CPU 100% 排查的步骤整理

    工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个 ...

  9. java接口经常变动前端怎么办_Java进程故障排查(CPU资源占用高,接口响应超时,功能接口停滞等)...

    故障分析 # 导致系统不可用情况(频率较大): 1)代码中某个位置读取数据量较大,导致系统内存耗尽,进而出现Full GC次数过多,系统缓慢: 2)代码中有比较消耗CPU的操作,导致CPU过高,系统运 ...

最新文章

  1. Btree(B-树)---C++
  2. Sending e-mail with Spring MVC--转载
  3. ftp服务器搭建遇到的问题
  4. endpointimpl怎么填参数_这是一篇VLOOKUP函数家族主要用法的合集,XLOOKUP来了!真香!但是,没有office365吃不着怎么办?...
  5. 笔记本wifi做热点 android通过热点上网
  6. Winform开发框架中工作流模块的动态处理
  7. 学一下HDFS,很不错(大数据技术原理及应用)
  8. Zynq7000硬件开发之电源供电系统(PDN)设计(一)
  9. 这篇文章,自带背景音乐。因为它来自1993年!
  10. 中国(龙港)首届 “港为人先”全球创新创业大赛
  11. 使用application对象实现网站访问量统计
  12. 浅谈 NCSI 及其在 Linux 上的实现
  13. Ja进av阶书籍推荐
  14. 超像素(slic算法)特征提取(颜色,纹理)——个人梳理
  15. 【双写迁移方案】实现动态切换实现分库分表
  16. 【毕业设计】基于微信小程序的购物商城系统 开题报告
  17. 2022-8-15 第七小组 学习日记 (day39)Mysql数据库
  18. 松下6轴程序模板 plc采用FP-XHC60T ,标准可带6轴程序
  19. 二分类精度一直在50%左右波动的可能原因
  20. LinkIt Smart 7688 问题汇总

热门文章

  1. Java medai framework(JMF)基础教程
  2. C: macro: 去除宏的实用工具unifdef
  3. ubuntu上传代码到github教程--token
  4. [BZOJ 1037] 生日聚会Party
  5. 如何正确在jsp中插入图片
  6. 怎么将flac格式的音乐转换为MP3格式
  7. 《王者荣耀》推出2022年第一个英雄,或将争夺峡谷第一美男
  8. external table
  9. 现在计算机大厂985本科是不是难进了?
  10. IDEA checkStyle