【问题标题】:Is it possible that a file lock never gets released?文件锁有可能永远不会被释放吗?
【发布时间】:2015-03-06 14:22:51
【问题描述】:

给定以下文件锁定请求:

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

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

【问题讨论】:

  • 无法保证 finally 块中的代码将永远运行...您可以在 try { } 块中的代码中进入无限循环。至于是否/何时释放文件锁,我并没有权威的答案,但我从经验中发现,即使你不释放锁,一般也会很快释放(不是总是立即)在 JVM 退出后。如果这不起作用,则需要重新启动。
  • @ControlAltDel 重新启动是指重新启动启动(崩溃的)JVM 的计算机?
  • 是重启电脑
  • @ControlAltDel 退出 JVM 将释放锁(如果没有其他操作)。无需whatsoever重新启动计算机。

标签: java locking release jvm-crash


【解决方案1】:

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

如果是 Windows,Oracle JVM 使用 LockFileEx function 作为本机实现并根据 msdn https://msdn.microsoft.com/en-us/library/aa365202.aspx

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多