1

我的应用程序(Java5)分布在几个 JVM 中,这些 JVM 从共享存储读取/写入文件(存储由 Windows 管理)。我想使用独占/共享锁进行文件写入/读取,如下所示:

    FileOutputStream fos = null;
    FileLock lock = null;
    ObjectOutputStream oos = null;
    try {
        fos = new FileOutputStream(new File("//share/test.dat"));  // HERE IT MAY THROW FileNotFoundException...
        lock = fos.getChannel().lock(); // ... and I won't acquire a lock.
        oos = new ObjectOutputStream(fos);
        oos.writeObject(value);
        return true;
    } catch (Exception e) {
        // Log it.
    } finally {
        // Close locks and I/O streams.
    }

问题:如果 JVM1 当前正在读取文件 test.dat 并且 JVM2 正在尝试写入同一个文件,则 FileNotFoundException(“该进程无法访问该文件,因为它正在被另一个进程使用”)将在 JVM2 上抛出“ new FileOutputStream(new File("//share/test.dat"))" 行。似乎是 Catch22 的情况:一方面我想获取锁来获取 I/O 流;另一方面,我需要一个 I/O 流来获取锁。正如我所看到的,与 RandomAccessFile 的情况相同。

有任何想法吗?..

4

1 回答 1

1

正如您从错误消息中看到的那样,Windows 不会让您做您想做的事情。如果您考虑一下,您可以将 Windows 错误本身视为锁定条件。无论如何,由于打开和锁定之间的时间窗口,您在这里会遇到一个同源问题。Windows 在某种程度上在这里帮了你一个忙。一次。

于 2012-09-20T10:11:04.663 回答