Java -- 每日一问:什么情况下Java程序会产生死锁?如何定位修复?

Posted Kevin-Dev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java -- 每日一问:什么情况下Java程序会产生死锁?如何定位修复?相关的知识,希望对你有一定的参考价值。

典型回答

死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程之间会发生,存在资源独占的进程之间同样也可能出现死锁。通常来说,我们大多是聚焦在多线程场景中的死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。

你可以利用下面的示例图理解基本的死锁问题:

定位死锁最常见的方式就是利用 jstack 等工具获取线程栈,然后定位互相之间的依赖关系,进而找到死锁。如果是比较明显的死锁,往往 jstack 等就能直接定位,类似 JConsole 甚至可以在图形界面进行有限的死锁检测。

如果程序运行时发生了死锁,绝大多数情况下都是无法在线解决的,只能重启、修正程序本身问题。所以,代码开发阶段互相审查,或者利用工具进行预防性排查,往往也是很重要的。

你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。

以上是关于Java -- 每日一问:什么情况下Java程序会产生死锁?如何定位修复?的主要内容,如果未能解决你的问题,请参考以下文章

Java -- 每日一问:一个线程两次调用start()方法会出现什么情况?

Java -- 每日一问:谈谈你对 Java 平台的理解?

Java -- 每日一问:Exception 和 Error 有什么区别?

Java -- 每日一问:StringStringBufferStringBuilder有什么区别?

Java -- 每日一问:StringStringBufferStringBuilder有什么区别?

Java -- 每日一问:动态代理是基于什么原理?