多线程以及多进程提高了系统资源的利用率以及系统的处理能力。然而,并发执行也带来了新的问题——死锁(DeadLock)。
所谓死锁指多个线程因竞争资源而造成的一种僵局(互相下饭,哦不互相等待),若无外力作用,这些进程都将无法向前推进。
也可以参考这篇优质文章:你的酒窝里有酒 - 线程死锁
常见的死锁解决办法:
(1)破坏请求和保持条件:一次性的申请所有资源,之后不再申请资源。如果不满足资源条件则得不到资源分配。只获得初期资源运行,之后将运行完的资源释放,请求新的资源。
(2)破坏不可抢占条件:当一个进程想要获得某种不可抢占资源,会提出新的资源申请。若不能满足,则释放所有资源,以后需要,再重新申请。
(3)破坏循环等待条件:对资源进行排号,按照序号递增的顺序请求资源。若进程获得序号高的资源想要获取序号低的资源,就需要先释放序号高的资源。
Tips:IDEA工具可以使用 jps -l 显示正在运行的虚拟机进程,也可以使用 jstack + 线程ID 对出现的问题进行跟踪排查。
以下列出几种常用的防止线程互相下饭,哦不互相等待的方法: