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

文章插图
或者jconsole连接到进程上:

文章插图

文章插图
通过堆栈信息能够很直接看到死锁信息 。
linux环境下dump出堆栈信息的方法我们后续再聊 。
死锁的避免
我们可以通过打破死锁发生的条件来避免死锁 。
【避免死锁危险】程序中的业务要求我们必须使用独占锁而不能使用共享锁,那我们就不能打破锁的互斥性 。
破坏占有且等待:一次性申请所有资源;
破坏不可抢占:使用显示锁Lock中的tryLock功能来代替内置锁synchronized,可以检测死锁和从死锁中恢复过来 。使用内置锁的线程获取不到锁会被阻塞,而显式锁可以指定一个超时时限(Timeout),在等待设置的时间后tryLock就会返回一个失败信息,也会释放其拥有的资源 。
破坏循环等待:使线程按照固定的顺序获取锁,在设计中我们应尽量减少锁的交互数量,提前设计好锁的顺序并严格遵守 。
结束语
并发编程系列基础知识的学习到此结束了,后续如果遇到相关的知识再补充 。
下一个系列《Java基础》扬帆启航,类加载、数据结构(包括线程安全的数据结构)、泛型等知识将与你相遇 。
祝大家圣诞节快乐!!
推荐阅读
- 避免喝茶的5个误区,喝茶的三大误区
- 怎么能避免写出慢SQL?
- 避免饮茶失礼,小孩能不能喝茶吗
- 程序员如何避免陷入内卷
- 宕机了,Redis如何避免数据丢失?
- Java内存泄漏、性能优化、宕机死锁的N种姿势
- Mysql 权限管理
- 手机怎么才能不被定位 手机如何避免被定位
- 避免赘肉的花草茶,花草茶饮用的注意事项
- 如果遇到暴雨洪水如何避免溺水 洪水过后会大旱吗
