【问题标题】:What can possibly go wrong when halting the JVM while a thread is doing I/O?在线程执行 I/O 时停止 JVM 可能会出什么问题?
【发布时间】:2018-04-16 10:05:46
【问题描述】:

我在this comment读到

如果您认为可能有正在运行的线程,请不要调用 System.exit(...) 做 I/O

杀死一个未完成的 I/O 操作是否可能比杀死一个数据库事务更糟糕?

【问题讨论】:

  • ...当您终止 JVM 时,运行 Java 线程的 (ny) 可能不会出错??
  • @Stultuske 当 JVM 结束时,有些线程可以干净地完成:像垃圾收集器这样的守护线程。
  • 我们不是在谈论这些,而是​​在谈论 I/O 执行。

标签: java multithreading io jvm


【解决方案1】:

当线程正在执行 I/O 时停止 JVM 可能会出什么问题?

因为如果这样做,很难确定 I/O 操作是否在 JVM 退出之前完成。对于可能正常的读取操作,但不完整的写入可能会导致数据永久丢失。

杀死一个未完成的 I/O 操作是否可能比杀死一个数据库事务更糟糕?

是的,情况更糟。

如果在数据库事务1 正在进行时终止 JVM,数据库将恢复到一致状态。这应该发生,即使 JVM 在正常的 JVM 关闭钩子没有运行的情况下被杀死。这是通过数据库以一种受控的方式将数据写入文件系统来实现的,这种方式可以抵御中断;即原子写入的某种组合,并以特定顺序写入内容。数据库可能需要在重新启动时进行一些恢复,但提交的数据将被安全保存。 (即 ACID 中的 D(耐久性)。)


1 - 假设数据库具有 ACID 属性,并且您不会遭受灾难性的介质故障。

【讨论】:

    【解决方案2】:

    System.exit() 杀死盒子上的整个 JVM(启动 JVM 关闭序列)。所以调用它会杀死你的网络应用程序/服务,但也可能会杀死你的应用程序服务器。如果您在所述服务器上部署其他任何东西,这些也会下降。 I/O 操作也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      相关资源
      最近更新 更多