有没有办法中断、终止或以其他方式解除(释放同步锁)单个死锁的Java线程,从而允许其他线程继续?

有没有办法中断、终止或以其他方式解除(释放同步锁)单个死锁的Java线程,从而允许其他线程继续?,java,synchronization,gdb,deadlock,interrupted-exception,Java,Synchronization,Gdb,Deadlock,Interrupted Exception,我有一个长期运行的过程,由于一个bug,一个普通的/可消耗的线程与一个我想继续的线程死锁,因此它可以执行一些最终报告,而这些报告很难以另一种方式重现 当然,为将来的运行修复bug是正确的最终解决方案。当然,任何线程的任何此类强制中断/终止/停止本质上都是不安全的,并且可能导致其他不可预测的不一致。(我熟悉所有标准警告及其原因。) 但是,由于唯一的替代方法是终止JVM进程,并经历一个更漫长的过程,这将导致不完整的最终报告,因此混乱的/不推荐的/危险的/有风险的/一次性的技术正是我想要尝试的 JVM

我有一个长期运行的过程,由于一个bug,一个普通的/可消耗的线程与一个我想继续的线程死锁,因此它可以执行一些最终报告,而这些报告很难以另一种方式重现

当然,为将来的运行修复bug是正确的最终解决方案。当然,任何线程的任何此类强制中断/终止/停止本质上都是不安全的,并且可能导致其他不可预测的不一致。(我熟悉所有标准警告及其原因。)

但是,由于唯一的替代方法是终止JVM进程,并经历一个更漫长的过程,这将导致不完整的最终报告,因此混乱的/不推荐的/危险的/有风险的/一次性的技术正是我想要尝试的

JVM是Sun在Ubuntu上的1.6.0_16 64位,可消耗线程正在等待锁定对象监视器

定向到确切线程的操作系统信号能否在可消耗线程中创建中断异常

使用gdb连接、直接篡改JVM数据或调用JVM过程是否允许强制释放消耗性线程持有的对象监视器

来自另一个线程的
Thread.interrupt()
是否会从等待锁定帧生成
InterruptedException
?(通过一些努力,我可以将任意beanshell脚本注入正在运行的系统。)

不推荐使用的
Thread.stop()
可以通过JMX或任何其他远程注入方法发送吗

任何想法都值得赞赏,越“危险”越好!而且,如果您的建议在类似情况下的个人经验中有效,那么最好

定向到确切线程的操作系统信号能否在可消耗线程中创建
中断异常

没有

使用gdb连接、直接篡改JVM数据或调用JVM过程是否允许强制释放消耗性线程持有的对象监视器

理论上是的。在实践中,您需要深入了解JVM的内部结构才能有成功的机会。所以,实际上没有

来自另一个线程的
Thread.interrupt()
是否会从等待锁定帧生成
InterruptedException
?(通过一些努力,我可以将任意beanshell脚本注入正在运行的系统。)

理论上是的。实际上,beanshell脚本需要为要中断的线程找到
Thread
对象。这可能涉及遍历
ThreadGroup
对象树等。另一个问题是被中断的线程是否会正常运行。例如,许多人编写等待/通知代码来捕获/忽略中断异常并重试。如果你这样做了,中断可能不会有任何好处

不推荐使用的Thread.stop()可以通过JMX或任何其他远程注入方法发送吗

如果可以调用
Thread.interrupt()
,则可以使用相同的方法调用
Thread.stop()
。通常,我会说不要这样做。但在这种情况下,可能值得一试


但所有这些真正的教训是,一个可能需要几天或几周才能产生答案的应用程序应该实现一个检查点/恢复机制来处理这种情况,以及诸如电源故障、硬件故障、机器重新启动等问题。

算了吧。在最好的情况下,您可以通过一些看门狗计时器检测死锁,忽略卡住的线程,并创建新线程以继续工作。不太令人满意。您无法解锁所涉及的锁,并且有两个(或更多)锁被持有。你不能让“消耗品”线程释放它持有的锁

有一个相当简单的方法来检测潜在的死锁:为每个锁指定一个从1向上的级别。强制执行规则“在持有锁时,线程必须只获取较低级别的锁”。如果发现违反规则,请修复编号。如果无法修复,则可能会出现死锁,如果运气不好,可能会变成真正的死锁。更改代码