多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
1、互斥条件:该资源任意一个时刻只由一个线程占用。
2、请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
3、不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
4、循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
破坏请求与保持条件 :
一次性申请所有的资源。
先释放后申请。
破坏不剥夺条件 :
占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
设置线程优先级,优先级高的可以抢占资源。
破坏循环等待条件 :
靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。
1、jstack 进程号
使用jps查看Java进程编号,然后使用jstack查看进程信息,出现下述信息表示出现了死锁。jstack会在最后给出进程的分析信息,表示出现了死锁。
2、图形化工具jconsole.exe
选择要检测的程序,点击检测死锁。