【问题标题】:Handling file locking, when the application quits unexpectedly处理文件锁定,当应用程序意外退出时
【发布时间】:2011-11-02 16:38:41
【问题描述】:

我正在研究锁定 Java 应用程序使用的某些文件的最佳(跨平台)方法。

最坏的情况是程序意外退出(用户强制终止,或不干净的退出)。在这种情况下,确保文件锁被释放的最佳方法是什么,这样它们就不会影响程序的任何后续访问?

我研究过使用 FileLock,但不干净的终止可能会使文件处于锁定的不可用状态。

有没有办法用代码解决这个问题?是在第一次“清理”时发现此类问题,还是在程序的后续运行中发现这些问题?

【问题讨论】:

  • 不是真正的问题。进程退出时,操作系统会释放所有文件锁和其他资源。

标签: java file-io locking file-locking


【解决方案1】:

我认为 FileLock 不存在您认为的问题。根据文档,它使用操作系统文件锁定功能,我认为这意味着大多数操作系统会在进程退出时清除进程持有的任何锁(尽管您可能需要做一些测试来验证这一点)。

否则你需要一种方法来确定锁是否过时。

使用 shell 脚本等处理此问题的常用方法是将进程的 ID (PID) 放入锁定文件中。这样,其他看到锁定文件的应用程序可以通过检查该进程是否正在运行来验证锁定是否仍然有效。如果进程没有运行,则可以清理锁。

虽然我不知道如何通过 Java 做到这一点...

【讨论】:

  • 显然它没有我想的问题。这些冲突问题对我来说是新的领域。
【解决方案2】:

最坏的情况是程序意外退出

在这种情况下,您的程序本身不能负责释放锁,因为它会停止执行。因此,您必须依赖程序之外的东西。但是那个东西本身不能是一个程序,因为它也可能意外退出。因此,您必须依赖操作系统本身。当然,没有跨平台的方式可以做到这一点。

【讨论】:

    【解决方案3】:

    您可以注册一个关闭挂钩,以在应用程序终止时释放任何FileLocks。显然,如果由于 PC 被重置、热点错误等导致 JVM 意外死机,则此代码将不会运行。

    File lockFile = new File("c:/tmp/lock");
    final FileLock lock = lockFile.channel().lock();
    
    Runtime.getRuntime().addShutDownHook(new Thread(new Runnable() {
      public void run() {
        lock.release();
      }
    }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2017-06-13
      相关资源
      最近更新 更多