我的应用程序(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 的情况相同。
有任何想法吗?..