5

1 つの仮想マシンで複数のアプリケーションを実行しています。1 つのサーバーで複数の仮想マシンを実行しています。そして、私は複数のサーバーを持っています。それらはすべて、Linux の共有フォルダーを使用してファイルを共有します。このファイルは、すべてのアプリケーションによって読み書きされます。書き込みプロセス中、アプリケーションはこのファイルを読み取ることができません。書き込みについても同様です。アプリケーションがファイルを読み取っている場合、アプリケーションはそのファイルに書き込むことができません。

書き込みプロセスが完了するのを待ってから読み取りを行うようにアプリケーションを同期するにはどうすればよいですか? またその逆も同様です。(VM内のアプリケーションは同期する必要があり、サーバー間でアプリケーションも同期する必要があります)

現在の実装では、「ファイル セマフォ」を使用しています。ファイルが書き込まれようとしている場合、アプリケーションは、共有フォルダーに追加のファイル (「file.semaphore」という名前を付けます) を作成して、セマフォを「取得」しようとします。「file.semaphore」ファイルが既に存在する場合、これはセマフォが別のアプリケーションによって既にロックされていることを意味します。このアプローチには、「ファイルが存在する」テストと「ファイルを作成する」操作がアトミックに実行されていることを確認できないという問題があります。このようにして、2 つのアプリケーションが「file.semaphore」ファイルをテストし、それが存在しないことを確認して、同時にファイルを作成しようとする可能性があります。

4

4 に答える 4

4

NIO ロック機能を使用できます。FileChannel#lock()を参照してください。

ただし、これは、基盤となるファイルシステムがネットワーク経由のロックをサポートしている場合にのみ機能します。最近の NFS はそれをサポートするはずです。おそらく、Samba もそれらをサポートしていますが、確かなことは言えません。

たとえば、記事を参照してください。

于 2008-11-26T09:56:17.150 に答える
0

createNewFile()メソッドのJavadocを見てください-ファイルの作成は同期の信頼できるメソッドではないと具体的に述べており、代わりにFileLockクラスを推奨しています(これはjava.nio.channelsの別のパッケージなので、基本的には何と同じです) Ivan Dubrovが提案しています)。

これは、問題の特定が正確であることを意味し、従来のファイル作成では、これをいじくり回しても解決されません。私が最初に考えたのは、createNewFile()からの戻りコードを確認することでしたが、Javadocが適切でないと言った場合は、次に進みます。

于 2009-01-23T12:15:55.077 に答える
0

JVM 間の保護のためのファイル ロックと、特定の JVM のスレッド内での同期を組み合わせる必要があります。サイバーモンクの回答はこちら

于 2014-10-17T14:16:22.173 に答える