死锁产生的4个必要条件?
1、互斥使用:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。(当资源被一个线程使用(占有)时,别的线程不能使用)
2、请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放(已占有不释放,同时请求其他资源)
3、不可抢占:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放(不能抢,只能对方自动释放)
4、环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。(P1占有P2的资源,P2占有P3的资源,P3占有P1的资源)
解决死锁的基本方法
1、资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
2、只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
3、可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
4、资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
4个java死锁检测工具:jstack、jconsole、jvisualvm、jmc
第一步:jps -l 命令列出当前的Java进程
![](https://img-blog.csdnimg.cn/img_convert/182d3bd6679220d37fb196fe3e8d1732.png)
1、jstack
找到疑似死锁的例子,找到 PID进程ID
jstack -l 52108
![](https://img-blog.csdnimg.cn/img_convert/e17baae6f728a8b82d5785c5f4781acb.png)
可以定位到哪个文件的多少行
2、jconsole
![](https://img-blog.csdnimg.cn/img_convert/035f3dc1de25105f5edd030f26266a15.png)
![](https://img-blog.csdnimg.cn/img_convert/420f1e42a0514161426dd09aab73de94.png)
![](https://img-blog.csdnimg.cn/img_convert/b57c8d083615a62fd78d628aa83726a4.png)
![](https://img-blog.csdnimg.cn/img_convert/6f015ef06ef51022b408012dd55ae3c1.png)
3、jvisualvm
![](https://img-blog.csdnimg.cn/img_convert/aa27854076fe625fefd9936dd16453e0.png)
![](https://img-blog.csdnimg.cn/img_convert/30e1db11eade88c1728d087399d956d1.png)
![](https://img-blog.csdnimg.cn/img_convert/c173106484776b88a42848771c5bea8c.png)
4、jmc
![](https://img-blog.csdnimg.cn/img_convert/5b1675e5c856920f456b75c698bca751.png)
![](https://img-blog.csdnimg.cn/img_convert/8464d367c105f70940c2ceaafa5e55d5.png)
![](https://img-blog.csdnimg.cn/img_convert/440b2c00b824edf0dbee6bccf20baf83.png)