1

共有ストレージからファイルを読み書きするアプリケーション (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 でも同じ状況です。

何か案は?..

4

1 に答える 1

1

エラー メッセージからわかるように、Windows では、ユーザーがしようとしていることを実行できません。考えてみれば、Windowsエラー自体をロック状態として扱うことができます。とにかく、オープンとロックの間のタイミングウィンドウのために、ここで同種の問題が発生します。ある意味で、Windows はここであなたに恩恵をもたらしています。一度だけ。

于 2012-09-20T10:11:04.663 に答える