-1

常に500以上のスレッドが一意のオブジェクトをバケットに同時にアップロードします。

この場合、Javaでバケットを実装するためにどのデータ構造/クラスを使用する必要がありますか。

ご参考までに:

ArrayList、Vector、ConcurrentHashMap、ArrayBlockingQueue、LinkedBlockingQueueを使用してみました。

ArrayListはスレッドセーフではないため、失敗します。ベクターは挿入により多くの時間を消費します。(モニターロックを取得するための待機時間が長いため)

...最後に、他の人と比較するのに適したArrayBlockingQueueを使用しました。

この場合、他に適切なクラス/データ構造が存在するかどうかを教えてください。

4

3 に答える 3

2

競合が非常に高くなるため、利用可能なロックフリーの待機フリーの実装を確認するか、単純にするためにConcurrentHashMapを使用することをお勧めします。

ここでの主な利点はロックストライピングです。そのため、読み取り操作ではロックがなく、書き込み操作では既存のバケットのサブセットのみがロックされ、ハッシュテーブル全体は再ハッシュのためにのみロックされます。

あなたはここでもう少し見つけることができます:

パフォーマンスConcurrentHashmapとHashMap

Javaハッシュテーブルの多くのアクセスの問題

于 2012-02-01T16:38:35.620 に答える
1

あなたはパフォーマンスを測定するための正しい決断をしています。

一般に、LinkedBlockingQueueは、ArrayListBlockingQueueよりも同時アクセスのパフォーマンスが優れているため、ぜひ試してみます。

于 2012-02-01T16:34:00.697 に答える
1

それは本当にあなたがものを追加した後、またはものを追加している間に何をしたいかに依存します。最初にそれについて考える必要があります。

考えられる最も単純なケースでは、後でオブジェクトを特定の順序で繰り返さないようにしたい場合があります。その場合、ConcurrentLinkedQueueは挿入パフォーマンスの点でおそらく最高です。

于 2012-02-01T16:36:05.227 に答える