You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux OpenJDK 8中RandomAccessFile.close释放全进程文件锁问题咨询

文件锁释放异常问题排查与疑问

排查Bug时发现:当线程B调用RandomAccessFile.close()(在RandomAccessFile.getChannel().tryLock()调用失败后),该操作会释放JVM进程内其他线程(如线程A)持有的文件锁,甚至可能关闭目标文件的所有打开流。

示例代码

public class Locker {
  static FileLock lockFile(String path) {
    try {
      RandomAccessFile f = new RandomAccessFile(path, "rw");
      try {
        FileLock lock = f.getChannel().tryLock();
        return lock; // Thread-A gets the lock
      }
      catch(OverlappingFileLockException | IOException ex) {
        f.close(); //Thread-B fails and closes, but this also releases the lock of Thread-A
        return null;
      }
    }
    catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  public static void main(String[] args) throws Exception {
    final String path = args[0];
    Thread t1 = new Thread(() -> lockFile(path));
    Thread t2 = new Thread(() -> lockFile(path));
    t1.start();
    t2.start();
    t1.join();
    t2.join();
  }
}

验证结果

通过Linux命令lslocks查看活跃锁,发现调用f.close()后,JVM进程不再持有该文件锁。

疑问

  • 该行为是否符合JDK的预期设计?
  • RandomAccessFile.close()是否会关闭JVM进程中目标文件的所有打开流?
  • 该现象仅在Linux环境出现,Windows机器上无法复现,是否属于Linux JVM Bug或特殊文件系统行为?

环境信息

  • 操作系统:Redhat 4.18.0-348.2.1.el8_5.x86_64
  • JDK版本:AdoptOpenJDK(build 1.8.0_212-b04)

内容的提问来源于stack exchange,提问作者PentaKon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:33:53