5

私のアプリケーションでは、メモリマッピングを使用してデータファイルに同時にアクセスする必要があります。私の目標は、共有メモリシステムでスケーラブルにすることです。メモリマップトファイルライブラリの実装のソースコードを調べた後、私は理解できません:

  • MappedByteBuffer複数のスレッドでから読み取ることは合法ですか?OS(* nix)レベルでget他をブロックしますか?get
  • putへのスレッドの場合MappedByteBuffer、コンテンツは呼び出している別のスレッドにすぐに表示されますgetか?

ありがとうございました。

ポイントを明確にするために:スレッドはMappedByteBuffer、複数のインスタンスではなく、の単一のインスタンスを使用しています。

4

1 に答える 1

1

バッファはスレッドセーフではないため、適切な同期によってアクセスを制御する必要があります。http://docs.oracle.com/javase/6/docs/api/java/nio/Buffer.htmlの「スレッドセーフ」セクションを参照してください。ByteBufferはBufferクラスのサブクラスであるため、同じスレッドセーフの問題があります。

共有メモリシステムでメモリマップトファイルをスケーラブルに使用しようとすると、私には非常に疑わしいように見えます。メモリマップトファイルの使用は、パフォーマンスのためです。共有システムに足を踏み入れるときは、パフォーマンスを探すことを優先度を低くする必要があります。遅いシステムを探す必要があるわけではありませんが、他にも多くの問題が発生するため、最初は単にシステムを機能させることが最優先事項である必要があります。最後に、メモリマッピングを使用したデータファイルへの同時アクセスを別のものに置き換える必要がある場合でも、驚くことはありません。

Exchangerの使用などのアイデアについては、「複数のスレッドがJavaで直接マップされたByteBufferへの書き込みを確認できるか」を参照してください。およびJavaのByteBufferスレッドを安全にするためのオプション

于 2013-01-24T08:11:12.547 に答える