共有ストレージからファイルを読み書きするアプリケーション (Java5) をいくつかの 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 でも同じ状況です。
何か案は?..