2 つ (またはそれ以上) の同時実行 Java プロセスがファイルの存在を確認し、存在しない場合は作成し、実行中にそのファイルから読み取る必要があるとします。複数のライター プロセスが相互に上書きしたり、リーダー プロセスがファイルの不完全または一貫性のないバージョンを読み取ったりする可能性から身を守りたいと考えています。
この状況を調停するために現在行っていることは、Java NIO FileLocks を使用することです。1 つのプロセスは、作成するファイルの排他ロックを取得して作成しますがFileChannel.tryLock()
、同時に実行されている他のプロセスはロックを取得できず、ファイルのメモリ内バージョンを使用して実行するようにフォールバックします。
ただし、ロックはコンピューティング ファームでさまざまな問題を引き起こしているため、代替手段を検討しています。私の質問は次のとおりです。ファイルロックを使用せずにこれを安全に行う方法はありますか?
たとえば、ファイルが存在しないことがわかったときにプロセスが独立した一時ファイルに書き込み、書き込み後に一時ファイルを多かれ少なかれ「アトミックに」移動することはできますか? このシナリオでは、最終的に複数の書き込みプロセスが発生する可能性がありますが、ファイルから読み取るプロセスが常にいずれかのバージョンを読み取り、2 つ以上のバージョンが混在していない場合は問題ありません。ただし、読み取り用にファイルを開いている場合、読み取りの途中で上書きされたとしても、元のバージョンのファイルから引き続き読み取りを行うことがすべてのオペレーティング システムで保証されているわけではありません。
どんな提案でも大歓迎です!