2

レコードを保存するために使用する 10 個のテキスト ファイルがあります。私のアプリケーションでは、ファイルへの書き込みとファイルの編集など、いくつかの操作があります(指定された行が見つかった場合は、一時ファイルを作成してそこにすべての情報を転送し、古いものを削除して一時ファイルの名前を変更します)。

すべてのクライアントが 10 個のテキスト ファイルにアクセスできるため、データの一貫性を維持するためにアクティビティを同期したいと考えています。

クライアントがファイルを編集または書き込みしている場合、たとえば f1.txt をロックまたは同期して、他のクライアントが同時に f2.txt を編集できるようにすることで、他のユーザーが書き込み/編集できず、同時実行性を高めたいと考えています。

public void writeToFile(String pathname){
File f1 = new File(pathname)
synchronize (f1) {.. // do something}
}

ここでの問題は、特定のパスで毎回新しいファイルを作成していることです。

ガイダンスとヘルプをいただければ幸いです。これでよろしいですか。

ありがとう

4

1 に答える 1

7

私の理解が正しければ、あなたは特定のファイル パスで同期したいと考えています (そして、ファイル システムはこれを好きなように強制していません)。Fileオブジェクトが機能しないことは正しいです。同期する必要があるのは、ファイルの名前です。

public void writeToFile(String pathname){
File f1 = new File(pathname)
synchronize (f1.getCanonicalPath().intern()) {.. // do something}
}

このメソッドは、同じパスを参照する 2 つのオブジェクトに対して同じ値をgetCanonicalPath返します。たとえば、とが同じファイルの場合、正規パスは同じになります。StringFile../logs/mylog.txt/var/spool/logs/mylog.txt

このinternメソッドは、同じを持つ 2 つのオブジェクトに対して同じ参照を返します。したがって、最終的にロックするのは、ファイルの正規パスのシングルトン インスタンスです。Stringvalue

あなたのニーズに合っていると思います。

于 2013-11-01T19:04:48.010 に答える