我的应用程序(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(“进程无法访问该文件,因为它正被另一个进程使用”)将在“new FileOutputStream(new File(”/ share / test.dat“))”行中抛出JVM2。 它似乎是Catch22案例:一方面我想获得一个锁来获取I / O流;另一方面,我需要一个I / O流来获取锁。 正如我所看到的,与RandomAccessFile相同的情况。
有什么想法吗?..
答案 0 :(得分:1)
正如您从错误消息中看到的那样,Windows只是不允许您执行您尝试执行的操作。如果您考虑它,可以将Windows错误本身视为锁定条件。无论如何,你会有一个同源问题,因为打开和锁之间的时间窗口。 Windows在某种程度上对你有帮助。一次。