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

时间:2018-04-16 10:05:46

标签: java multithreading io jvm

我在this comment

中读到
  

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

杀死未完成的I / O操作可能比杀死例如数据库事务更糟糕吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

在线程执行I / O时暂停JVM会出现什么问题?

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

  

杀死未完成的I / O操作可能比杀死例如数据库事务更糟糕吗?

是的,情况更糟。

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

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