我正在研究锁定 Java 应用程序使用的某些文件的最佳(跨平台)方法。
最坏的情况是程序意外退出(用户强制终止,或不干净的退出)。在这种情况下,确保文件锁被释放的最佳方法是什么,这样它们就不会影响程序的任何后续访问?
我看过使用 FileLock,但不干净的终止可能会使文件处于锁定的不可用状态。
有没有办法用代码解决这个问题?是在第一次“清理”时发现此类问题,还是在程序的后续运行中发现这些问题?
我正在研究锁定 Java 应用程序使用的某些文件的最佳(跨平台)方法。
最坏的情况是程序意外退出(用户强制终止,或不干净的退出)。在这种情况下,确保文件锁被释放的最佳方法是什么,这样它们就不会影响程序的任何后续访问?
我看过使用 FileLock,但不干净的终止可能会使文件处于锁定的不可用状态。
有没有办法用代码解决这个问题?是在第一次“清理”时发现此类问题,还是在程序的后续运行中发现这些问题?
我不认为 FileLock 有你认为的问题。根据文档,它使用操作系统文件锁定功能,我认为这意味着大多数操作系统会在进程退出时清除进程持有的任何锁(尽管您可能需要做一些测试来验证这一点)。
否则,您需要一种方法来确定锁是否过时。
使用 shell 脚本等处理此问题的常用方法是将进程的 ID (PID) 放入锁定文件中。这样,其他看到锁定文件的应用程序可以通过检查该进程是否正在运行来验证锁定是否仍然有效。如果进程没有运行,则可以清理锁。
虽然我不知道通过Java做到这一点的方法......
最坏的情况是程序意外退出
在这种情况下,您的程序本身不能负责释放锁,因为它会停止执行。因此,您必须依赖程序之外的东西。但是那个东西本身不能是一个程序,因为它也可能意外退出。因此,您必须依赖操作系统本身。当然,没有跨平台的方法可以做到这一点。
您可以注册一个关闭挂钩FileLock
以在应用程序终止时释放任何s。显然,如果由于 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();
}
}));