Java并发编程(6) —— 什么是死锁
一、什么是死锁
多个线程互相持有并且不释放对方需要的资源因此都处于无限阻塞的状态,称为死锁
二、产生死锁的四个必要条件
- 互斥条件:一个资源任意一个时刻只由一个线程占用,具有排它性。
- 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件: 线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
- 循环等待条件: 若干线程之间形成一种头尾相接的循环等待资源关系。
三、如何避免死锁
破坏死锁的产生的必要条件即可:
- 破坏请求与保持条件 :一次性申请所有的资源。
- 破坏不剥夺条件 :占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
- 破坏循环等待条件 :靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。
四、发生死锁如何检测
当程序运行后迟迟得不到结果,可能是由于多个线程发生了死锁,可通过如下手段去检测
1. jstack命令
jstack是JDK自带的一个命令行工具,可以打印出Java应用程序中所有线程的堆栈信息。使用该命令可以查看当前Java应用程序的线程状态,找出可能存在的死锁问题。
jstack 进程id
2. jvisualvm工具
jvisualvm是JDK自带的一种图形化监控工具,可以用于监控Java应用程序的各种运行状态。在jvisualvm中,可以查看当前应用程序的线程状态,包括线程的运行状态、阻塞状态、等待状态等等。通过观察不同线程之间的状态关系,可以判断是否存在死锁问题。