郑州Java学习教程之死锁的检测及预防措施分享
作为一个合格的程序员,当你发现程序没有响应、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学习进阶资料以及丰富的项目实战练习,带给你不一样的学习体验!
相关推荐HOT
更多>>大数据培训学习什么,你了解多少
大数据培训学习什么?你了解多少?随着互联网技术的不断发展,大数据技术开始走进人们的视野,并成为现阶段吃香的技术能力之一。那么熟练掌握大...详情>>
2023-03-16 15:16:01云计算培训怎么样?可靠吗
云计算培训怎么样?可靠吗?靠不靠谱要看你什么要求了,因人而异。但如果你是想通过培训机构快速掌握好技能,然后进入行业,这个一般都没有问题...详情>>
2023-03-07 14:51:00java编程工资多少?主要学哪些内容
java编程工资多少?主要学哪些内容?java程序员的月收入在6000-20000不等,在一线城市有工作经验的java程序员的薪资收入会高一些,在二三线城市...详情>>
2023-02-24 14:56:07it工程培训机构,云计算难学吗
下面给小伙伴们列举一个学习大纲参考: 第一阶段: 零基础入门 1、计算机基础 2、Raid设置与网络服务基础 3、网络基础 第...详情>>
2022-12-01 17:48:04