代码之家  ›  专栏  ›  技术社区  ›  Kalle Richter

如果仍然抛出OverlappingFileLockException,在FileChannel.lock中等待的目的是什么?

  •  1
  • Kalle Richter  · 技术社区  · 7 年前

    FileChannel.lock How can I lock a file using java (if possible) 具有 FileOutputStream NonWritableChannelException

    FileOutputStream out = new FileOutputStream(file);
    try {
        java.nio.channels.FileLock lock = out.getChannel().lock();
        try {
            ...
        } finally {
            lock.release();
        }
    } finally {
        out.close();
    }
    

    lock

    将阻塞,直到可以锁定区域、关闭此通道或中断调用线程(以先到者为准)。

    但是,每次我试图锁定同一个文件(跨整个文件的区域)时,都会得到一个 OverlappingFileLockException 它被抛出

    这与锁的逻辑相矛盾,并且使得无法使用文件锁,因为如果队列中只允许一个线程(其他线程立即抛出),则需要手动同步资源访问 重叠FileLockException ).

    lock(0, Long.MAX_VALUE, false) 哪里 false 指 shared 属性不会更改此行为。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Kalle Richter    7 年前

    文件锁代表整个Java虚拟机。它们不适合控制同一虚拟机中多个线程对文件的访问。

    读取“它们不能用于控制,因为每个JVM只能获取一个锁”。