1

我拿了一个 Java 程序的线程转储,它说Found one Java-level deadlock.

我可以自信地确认该程序中存在错误吗?

对我来说,听起来死锁是一个编程问题,唯一的解决方案是修复源代码。
我错了吗?是否存在死锁是程序执行的正常部分,而死锁最终会以某种方式消失的情况?

它是一个相当传统的 Java Web 应用程序,拥有数百个用户。相互等待的两个线程似乎是一个Tomcat请求工作者和一个Lucene索引作业,两者都使用sun.misc.Unsafe.park. 据我所知,该程序没有任何线程监控功能。

4

2 回答 2

4

是否存在死锁是程序执行的正常部分,而死锁最终会以某种方式消失的情况?

理论上是的,取决于死锁的种类。

例如,如果两个线程Object.wait()死锁,其中一个等待调用可能会超时(最终)。或者,第三个线程可以通过调用Thread.interrupt()其中一个死锁线程来打破死锁。这可能是作为一种蓄意的打破僵局的策略,或出于其他原因。

另一方面,获取原始互斥锁的死锁永远不会自行消失,并且不能通过调用已弃用的线程停止/终止方法之一来打破。如果你这样做,你很可能使数据结构处于中间状态,从而在打破锁后继续存在问题。


要寻找的关键是阻塞动作是否可中断;例如它是否可以抛出一个InterruptedException或类似的。

于 2012-07-03T03:03:23.883 回答
0

这有点像一个例外(尽管是一个非常恶心和丑陋的 :)):如果您准备好处理死锁,因为它们可能发生在您的应用程序中(例如,您正在用 java 编写数据库服务器),那么什么都没有他们错了。

也就是说,在大多数情况下,这确实是一个错误,例如未经检查的异常,可怕的 NPE :(

于 2012-07-03T03:08:36.573 回答