Java死锁
迪丽瓦拉
2024-05-29 03:08:27
0

什么是死锁?

多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

死锁的必要条件:

1、互斥条件:该资源任意一个时刻只由一个线程占用。

2、请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。

3、不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。

4、循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。

如何预防死锁? 破坏死锁的产生的必要条件即可:

  1. 破坏请求与保持条件

    一次性申请所有的资源。

    先释放后申请。

  2. 破坏不剥夺条件

    占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。

    设置线程优先级,优先级高的可以抢占资源。

  3. 破坏循环等待条件

    靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。

如何判断是否死锁

1、jstack 进程号

使用jps查看Java进程编号,然后使用jstack查看进程信息,出现下述信息表示出现了死锁。jstack会在最后给出进程的分析信息,表示出现了死锁。

2、图形化工具jconsole.exe

选择要检测的程序,点击检测死锁。

相关内容