質問

:ファイルをロックおよびロック解除する方法に関する他の投稿を読みました。知らなかった特別なものは見つかりませんでした。だから誰かがいくつかの提案をすることができるように、ここに私のシナリオを置くつもりです。

私の経験では、FileChannel.lockは、jvmの複数のインスタンスの異なるオブジェクトがファイルをロックおよび更新しようとしている場合、ファイルのロックおよびロック解除の状況を保証しません。

私のアプリケーションのシナリオは次のとおりです。ファイルを更新する3つの別個のプログラムがあります。これらのプログラムは、異なるjvmインスタンスで実行されます。プログラムがA、B、Cで、ファイルがFであるとします。Aがファイルをロックする場合、F、B、CはFが解放されるのを待ってから、他のプログラムの1つがそのファイルを保持できます。プログラムが同じjvmインスタンスで実行されている場合、これは正常に機能します。残念ながら、これは複数のjvmインスタンスでは機能しません。

Fを更新する必要があるかどうかを示すフラットファイルを作成するという別のアイデアがありました。そのフラットファイルの内容は、ロックまたはロック解除できます。デフォルト/初期値はロック解除されます。そのため、プログラムの1つがFを更新する場合、フラットファイルでフラグを確認する必要があります。フラグがロックされている場合、待機する必要があります。ただし、このアプローチには問題があります。複数のプログラムがまったく同じ時間にフラットファイルを開き、「UNLOCKED」を参照した場合はどうなるでしょうか。または、フラットファイルがUNLOCKEDを読み取るのを待っていた2つのプログラムで、同時にファイルが「UNLOCKED」を読み取ることを確認しますか?

アイデアはありますか?

役に立ちましたか?

解決

ファイルシステムをロックする必要がある場合は、ディレクトリを作成する必要があります。ディレクトリが存在するとは「ロック」を意味し、ディレクトリが存在しないとはロックを解除します。

理由は、ディレクトリの作成と削除は、どのファイルシステムでもアトミック操作でなければならないからです。そのため、2つのプロセスが同じディレクトリを作成しようとすると、そのうちの1つがエラーになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top