避免死锁危险( 二 )

我们可以通过JDK提供的jstack或者jconsole工具查看死锁信息 。
jstack -l pid查看堆栈信息:

避免死锁危险

文章插图
 
或者jconsole连接到进程上:
避免死锁危险

文章插图
 

避免死锁危险

文章插图
 
通过堆栈信息能够很直接看到死锁信息 。
linux环境下dump出堆栈信息的方法我们后续再聊 。
 
死锁的避免 
我们可以通过打破死锁发生的条件来避免死锁 。
【避免死锁危险】程序中的业务要求我们必须使用独占锁而不能使用共享锁,那我们就不能打破锁的互斥性 。
破坏占有且等待:一次性申请所有资源;
破坏不可抢占:使用显示锁Lock中的tryLock功能来代替内置锁synchronized,可以检测死锁和从死锁中恢复过来 。使用内置锁的线程获取不到锁会被阻塞,而显式锁可以指定一个超时时限(Timeout),在等待设置的时间后tryLock就会返回一个失败信息,也会释放其拥有的资源 。
破坏循环等待:使线程按照固定的顺序获取锁,在设计中我们应尽量减少锁的交互数量,提前设计好锁的顺序并严格遵守 。
 
结束语 
并发编程系列基础知识的学习到此结束了,后续如果遇到相关的知识再补充 。
下一个系列《Java基础》扬帆启航,类加载、数据结构(包括线程安全的数据结构)、泛型等知识将与你相遇 。
祝大家圣诞节快乐!!




推荐阅读