在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
相信程序员都会碰上这样的问题,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实战项目在线培训课程?无论是自学过程中,还是在培训班学习,大家都应该注重实战项目的学习。毕竟学习Java最终目的是为了就业,拥有项目的实战经验才可以增加自己就业的机会。所以在学习Java的过程中,一定要多掌握几个实战项目。
9394
2019-08-08 11:56:27
Kotlin与Java相比的优缺点有哪些?
Kotlin语言被谷歌公开作为Android官方开发语言之后,就有传言,kotlin会取代Java。然而即使到了现在还是有很多人并不了解kotlin是什么。所以今天小编给大家科普一下关于kotlin的一些问题。
14039
2019-08-09 18:03:46
Java架构师是做什么的?如何成为高薪的Java架构师?
Java架构师是做什么的?简单来说,Java架构师就是技术骨干,主要负责负责设计和搭建软件系统架构,优化现有系统的性能,带领团队不断完善开发开发方法等等。那么如何成为高薪的Java架构师? 这其实需要软硬能力都得具备,软实力大概就是需要沟通协调,带领团队的领导力;硬实力就是需要最专业技术的掌握,下面我们来详细说明一下这一点。
4515
2019-11-11 15:14:18
如何才能达到Java架构师技术要求标准?
Java架构师需要熟练掌握复杂的数据结构和算法、熟练使用linux操作系统,Linux线上排除故障、熟悉tcp协议、系统集群、负载均衡、反向代理、动静分离,网站静态化、数据库设计能力、队列中间件等知识。
4596
2020-02-14 18:33:54
JavaEE实战项目手机快速登录讲解
今天要讲解的JavaEE实战项目是一款应用于健康管理机构的业务系统,它叫做传智健康,能够实现健康管理机构工作内容可视化、会员管理专业化、 健康评估数字化、健康干预流程化、知识库集成化,从而提高健康管理师的工作效率,加强与会员间的互动,增强管理者对健康管理机构运营情况的了解。下面我们来一起看看传智健康实战项目的移动端开发内容,主要包括了需求分析和手机快速登录。
5411
2020-04-22 12:06:56