10

ビッグデータのキャッシュとしてファイルを使用しています。1 つのスレッドが順番に書き込み、別のスレッドが順番に読み取ります。

Java メモリー・モデルに関して適切な「先行発生」関係を前提として、あるスレッドで(によってwrite()) 書き込まれたすべてのデータが別のスレッドからのものであると確信できますか? read()この動作は文書化されていますか?

私のJDKでは、FileOutputStreamオーバーライドせずflush()OutputStream.flush()空です。だからこそ気になる…

問題のストリームは、私が完全に制御できるクラスによって独占的に所有されています。各ストリームは、1 つのスレッドのみによってアクセスされることが保証されています。私のテストでは、期待どおりに動作することが示されていますが、これが保証され、文書化されているかどうかはまだ疑問です.

この関連する議論も参照してください。

4

4 に答える 4

11

posixファイルシステムを使用していると仮定すると、そうです。

FileInputStreamFileOutputStream* nixでは、内部で読み取りおよび書き込みシステムコールを使用します。書き込みのドキュメントによると、読み取りには過去の書き込みの結果が表示されます

通常のファイルへのwrite()が正常に返された後:

その書き込みによって変更されたファイル内の各バイト位置からのread()が成功すると、そのようなバイト位置が再度変更されるまで、その位置のwrite()によって指定されたデータが返されます。

Windows上のntfsにも同じread() write()保証があると確信しています。

于 2012-10-07T21:21:14.543 に答える
4

オブジェクトはメモリやスレッドを共有しないためFileInputStream、オブジェクト間のJavaメモリモデルの観点から「happens-before」の関係について話すことはできません。FileOutputStreamVMは、同期要件を尊重するだけで、それらを自由に並べ替えることができます。アプリケーションレベルのバッファリングなしで読み取りと書き込みを適切に同期できれば、安全です。

ただし、ファイルFileInputStreamFileOutputStream共有すると、OSに任せられ、メインストリームでは書き込み後に順番に読み取ることが期待できます。

于 2012-10-07T21:23:40.697 に答える
0

FileOutputStream が flush() をオーバーライドしない場合、OS がデータに対して奇妙なことをしない限り (たとえば、ブロックするのではなく、適切な速度でハードドライブを回転させるなど)、すぐに書き込まれないようにします。

于 2012-10-07T21:19:36.660 に答える
0

いいえ、(少なくとも Buffered(Input|Output)Streams の場合は) Streams を flush() する必要があります。そうしないと、データがバッファ内にある可能性があります。

たぶん、並行データ構造が必要ですか?

于 2012-10-05T08:08:43.460 に答える