代码之家  ›  专栏  ›  技术社区  ›  gojomo

任何中断、杀死或以其他方式解除(释放同步锁)的单一死锁Java线程允许其他线程继续?

  •  1
  • gojomo  · 技术社区  · 15 年前

    我有一个长时间运行的进程,在这个进程中,由于一个bug,一个微不足道的/可消耗的线程与一个我想继续的线程死锁,这样它就可以执行一些最终的报告,而这些报告很难以另一种方式重现。

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

    但是,因为唯一的选择是终止jvm进程并执行一个更长的过程,这将导致不太完整的最终报告,所以混乱/不推荐/危险/风险/一次性技术正是我想要尝试的。

    jvm是sun在ubuntu上的1.6.0u1664位,消耗线程正在等待锁定对象监视器。

    定向到某个线程的操作系统信号能否在可消耗线程中创建InterruptedException?

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

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

    被弃用的 Thread.stop() 通过JMX或任何其他远程注入方法发送?

    任何被欣赏的想法,越“危险”,越好!而且,如果你的建议在类似的情况下能在个人经验中发挥作用,那就最好了!

    2 回复  |  直到 7 年前
        1
  •  2
  •   Stephen C    15 年前

    定向到一个确切线程的操作系统信号能否创建 InterruptedException 在可消耗的线索里?

    不。

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

    理论上是的。在实践中,您需要深入了解jvm的内部,才能有任何成功的机会。所以,实际上不是。

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

    理论上是的。实际上,beanshell脚本需要 找到 这个 Thread 对象以中断线程。可能需要穿越 ThreadGroup 对象等。另一个问题是被中断的线程是否正常工作。例如,许多人编写等待/通知代码来捕获/忽略 中断异常 然后再试一次。如果你已经这样做了,中断可能不会有任何好处。

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

    如果你能打电话 线程。中断() 您可以使用相同的方法调用 Thread.stop() . 通常情况下,我会说不要这样做。但在这种情况下可能值得一试。

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

        2
  •  0
  •   gnasher729    11 年前

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

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

    推荐文章