我接受了Java程序的线程转储,它说Found one Java-level deadlock
。
我可以自信地确认此计划中存在错误吗?
对我而言,deadlock听起来像编程问题,唯一的解决办法是修复源代码。
我错了吗?是否存在死锁是程序执行的正常部分的情况,并且死锁最终会以某种方式消失?
这是一个相当传统的Java Web应用程序,拥有数百个用户。两个正在等待的线程似乎是一个Tomcat请求工作者和一个Lucene索引作业,两者都使用sun.misc.Unsafe.park
。据我所知,该程序没有任何线程监控元复杂性。
答案 0 :(得分:4)
是否存在死锁是程序执行正常部分的情况,死锁最终会以某种方式消失?
理论上是的,取决于死锁的类型。
例如,如果两个线程Object.wait()
死锁,则其中一个等待调用可能会超时(最终)。或者,第三个线程可以通过在其中一个死锁线程上调用Thread.interrupt()
来打破死锁。这可能是故意破解僵局的策略,或者是出于其他原因。
另一方面,获取原始互斥锁的死锁不会自行消失,并且不能打破调用其中一个不推荐使用的Thread stop / kill方法。如果你这样做,你就有可能将数据结构保留在中间状态,这使得在打破锁定后继续存在问题。
要寻找的关键是阻止行为是否可以中断;例如它是否可以抛出InterruptedException
或类似的东西。
答案 1 :(得分:0)
它有点像异常(虽然非常恶心和丑陋:) :):如果你准备处理死锁,因为它们可能发生在你的应用程序中(例如你在java中编写数据库服务器)然后他们没有错。
那就是说,对于大多数情况来说,真的是一个错误,比如未经检查的异常,可怕的NPE :(