是否有可能永远不会释放文件锁?

sp0*_*00m 1 java locking release jvm-crash

鉴于以下文件锁定请求:

FileLock lock = null;
try {
    lock = randomAccessFile.getChannel().lock(0, Long.MAX_VALUE, mode.shared);
    // work with file
} finally {
    if (lock != null) {
        lock.release();
    }
}
Run Code Online (Sandbox Code Playgroud)

目标操作系统是 MS Windows,是否有可能finally永远不会执行该块,从而永远不会释放锁?例如,如果 JVM 崩溃了怎么办?如何处理这种无所有者锁定?

Iva*_*tov 5

当进程退出时,任何操作系统都会自动释放进程获取的所有资源,但无法保证何时会发生这种情况。

在 Windows 的情况下,Oracle JVM 使用LockFileEx 函数作为本机实现并根据 msdn https://msdn.microsoft.com/en-us/library/aa365202.aspx

如果进程以文件的一部分被锁定或关闭具有未完成锁的文件而终止,则操作系统会解锁这些锁。但是,操作系统解锁这些锁所需的时间取决于可用的系统资源。因此,建议您的进程在终止时明确解锁它已锁定的所有文件。如果不这样做,如果操作系统尚未解锁这些文件,则可能会拒绝访问这些文件。