作为一个合格的程序员,当你发现程序没有响应、CPU占用率又不是特别高的时候,第一反应应该是死锁。何为死锁?当两个或多个线程正在等待彼此释放所需的资源并陷入无限等待时,这种情况称为死锁,它只会发生在多任务或者多线程的情况下。今天千锋小编分享的郑州Java学习教程就给大家讲解一下如何检测Java中的死锁以及怎样预防死锁。
如何检测Java中的死锁?
1)查看代码。看看嵌套的synchronized块是从另一个synchronized块中调用同步方法,还是试图锁定另一个对象。如果是这种情况,那么很有可能出现死锁。
2)确定死锁风险的另一种方法是在运行应用程序时实际上遇到死锁。如果发生这种情况,可以尝试进行线程转储,在Linux中,可以通过命令“kill -3”执行此操作。这将打印应用程序日志文件中所有线程的状态,可以看到哪个线程锁定在哪个对象上。
怎样预防死锁?
死锁的根本原因:1)是多个线程涉及到多个锁,这些锁存在着交叉,所以可能会导致了一个锁依赖的闭环;2)默认的锁申请操作是阻塞的。所以要避免死锁,就要在一遇到多个对象锁交叉的情况,就要仔细审查这几个对象的类中的所有方法,是否存在着导致锁依赖的环路的可能性。
1)如何预防死锁尽量保证加锁顺序是一样的。
例如有A、B、C三把锁。Thread 1的加锁顺序为A、B、C,Thread 2的加锁顺序为A、C,这样就不会死锁。如果Thread2的加锁顺序为B、A或者C、A这样顺序就不一致了,就会出现死锁问题。
2)尽量用超时放弃机制。
Lock接口提供了tryLock(long time, TimeUnit unit)方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。可以避免死锁问题。
3)避免同步调用其他对象。
Java是面向对象的编程语言,程序的最小单元是对象,对象封装了数据和操作,所以Java中的锁一般也是以对象为单位的,对象的内置锁保护对象中的数据的并发访问。如果我们能够避免在对象的同步方法中调用其它对象的同步方法,那么就可以避免死锁产生的可能性。
当然,在实际工作中,有些Java程序员在线程日志里看不到死锁信息,这主要是因为线程都是处在Runable状态。一般这种情况下你需要直接看线程栈的内容,自己分析。
以上就是郑州Java学习教程中有关死锁的相关内容,如果你想了解更多Java开发知识,可以关注“千锋郑州”微信公众号,还可以来千锋郑州Java培训班试听体验,潮流高端的课程、更多Java学习进阶资料以及丰富的项目实战练习,带给你不一样的学习体验!
相关文章
02.24抢座
02.03抢座
02.03抢座
12.23抢座
12.23抢座
12.23抢座
12.16抢座
12.02开班
11.25开班
11.25开班
了解千锋动态
关注千锋教育服务号
扫一扫快速进入
千锋移动端页面
扫码匿名提建议
直达CEO信箱