2011-11-07 11 views
2

一時ファイルにデータを書き込んで、このファイルをディレクトリAに保存する必要があります。これを行うには、File.createTempFileメソッドを使用します。しかし、ディレクトリAを定期的にポーリングして処理する一時ファイルがあるかどうかをチェックするスレッドがあります。ファイルを読み取り不可能に設定する

// create a temporary file that will contain the data 
newTmpFile = File.createTempFile("prefix", recoverFileExt, new File(
       recoverDirectory)); 
// the file is set to non readable, so the recovery thread cannot 
// access it 
newTmpFile.setReadable(false); 

//write data into the file 

// the file is written, it is set to readable so the recovery thread 
// can now access it 
newTmpFile.setReadable(true); 

問題は、書き込み操作が行われる前にリカバリスレッドがファイルにアクセスしないようにすることです。したがって、私はこのメカニズムを使用します。ファイルを作成し、それを非可読として設定し、書き込み可能にし、可読性を設定して閉じます。問題は、ファイルの作成直後にファイルが読み込み可能であり、スレッドがそのファイルにアクセスできることです。

私は、作成時にファイルを非可読として設定する可能性があるか、他に解決策があるかどうかを知りたかったのです。

おかげ

答えて

5

私の提案は、最初に(例えば、異なる接頭辞を使用して)ファイルに別の名前を付けると、それが書かれています後にその名前を変更することです。

このようにして、リカバリスレッドは、部分的に作成されたファイルと完全に書き込まれたファイルを区別し、後者のみを処理できます。

+0

同じファイルシステム上にある場合、ディレクトリ間でファイルの名前をすばやく変更できることにも注意してください。 (それはNFSでは推奨されていませんが、NFSは実際には「データの完全性」のために入りません)。 –

+0

私はその施設の答えを受け入れます。しかし、私は、同期のためにファイル名を使用するのは良い方法ではないことを理解しています。 –

0

これはこれを行う方法ではありません。スレッド同期を制御するには、セマフォ/ミューテックスを使用します。ファイルを使用してスレッドを同期させようとするのは悪い習慣であり、後でより多くのバグが発生します。

0

あなたは、このようにロック機構として、ファイルシステムを使用してはならないファイル

のインデックスを作成します。別のファイル名を持つAixのソリューションが動作しますが、理想的ではありません。

もっと良い解決策は、両方のスレッドがアクセスできるどこかのメモリにロードされたファイルのインデックスを持つことです。処理のためにファイルを作成するときはいつでも、処理が完了して処理できる状態になったら、そのファイルをインデックスに追加します。次に、リカバリスレッドは、処理するインデックスに指定されているファイルにのみアクセスします。

このインデックスは、事実上、回復スレッドの作業キューになります。

0

私は、スレッドが無視する特別な名前のファイルを作成することでそれを回避します。次に、最初に名前を変更して、それを読み取り可能に変更します。したがって、ファイルが読み取れないかどうか、またファイルに特別な名前があるかどうかなど、2つのチェックがあります。

0

スレッドが同じプロセスにある場合は、安全に書き込まれたデータの量を制御するカウンタを保持できます。これにより、リカバリー・ジャーナルを書かれた直後に処理することができます。

関連する問題