web-dev-qa-db-ja.com

ロックなしでJavaにデータを同時に書き込む方法は?

各スレッドが(もちろん任意の順序で)データを書き込み/出力する必要があるが、ファイルまたは特定のデータ構造に関連するロックのオーバーヘッドがないマルチスレッドプログラムを実装する方法。

各スレッドが個別のファイルに書き込むことは実現可能なオプションですか? (オーバーヘッドをロックするために書きました)

ファイルの代わりにSystem.out.printまたはBufferWriterを使用できますか?または、他のエレガントなソリューションはありますか?

3
Outflanker

複数のスレッドが互いに独立してデータを生成している場合、個別のファイルに書き込むことは確かに良いオプションです。オペレーティングシステムはファイルシステムの一貫性を保つ必要があるため、内部的にロックがいくらか発生しますが、手動ロックで単一のファイルに書き込むか、標準出力(内部同期を持つ)に書き込むよりも優れています。同様に、ネットワーク経由でアクセスできるオンラインストレージにアクセスできる場合は、各スレッドから独立してデータを送信できます。

しかし、大きな「しかし」があります。大量のデータ(マシンの仕様によっては数MB /秒以上)を書き込むと、ファイルシステムが追い付かない場合があります。このような状況では、ボトルネックはファイルシステムであり、アプリのロックではありません。これが発生した場合、複数の場所への同時書き込みは単一の場所での書き込みよりもファイルシステムとディスクに多くの負荷をかける可能性があるため、実際には単一のファイルとロックの方が良いかもしれません。したがって、すべてに依存し、1から多数の同時書き込みの数が最適な場合があります。最善の策は、同時書き込みの数をパラメーター化可能にしてから、いくつかの異なる値についてアプリケーションの最終的なパフォーマンスを比較することです。

1