2012-02-01 5 views
-1

ユニークなオブジェクトを同時にバケットにアップロードするスレッドが500以上あります。Javaでの同時データ挿入を処理するクラス

この場合、Javaでバケットを実装するために使用するデータ構造/クラスはどれですか。 FYI

私はArrayListに、ベクトル、のConcurrentHashMap、ArrayBlockingQueue、LinkedBlockingQueueを使用してみました。

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

...最後に、私は他のものと比較してうまく聞こえるArrayBlockingQueueを使用しました。

この場合、他のクラス/データ構造が他に存在する場合は、私にお勧めします。

+0

を使用すると、セットまたはリストは必要ですか?すなわち、データ構造が重複要素を自動的にフィルタリングすべきかどうか?これはデータ構造の重要な違いであり、あなたの質問に答えることが重要です。 –

+0

重複する要素はありません。具体的には私はリストが必要です。 – krishna

答えて

2

競合は非常に高いので、利用可能なロックフリーの待機のない実装を見たり、シンプルに保つために、ConcurrentHashMapを使用することができます。

ここではロックストライピングが重要なので、読み取り操作ではロックはなく、書き込み操作では既存のバケットのサブセットのみをロックし、ハッシュテーブル全体を再ハッシュするにはロックします。

あなたはもっとここにビットを見つけることができます。

Performance ConcurrentHashmap vs HashMap

Java Hashtable many accesses problem

1

パフォーマンスを測定するために正しい決定を下しています。

通常、LinkedBlockingQueueはArrayListBlockingQueueよりも並行アクセスのほうが優れていますので、私は間違いなくそれを試みます。

+0

私の場合、挿入は同時でしかありません。値のアクセスやポーリングは、1つのスレッドで処理されます。 – krishna

1

これは本当にあなたが何かを追加した後、または追加中にしたいかによって異なります。まず、それについて考える必要があります。

想像できる最も単純なケースでは、あとで特定の順序でオブジェクトを反復したいと思うかもしれません。その場合は、おそらくConcurrentLinkedQueueが挿入パフォーマンスの点で最も優れています。

関連する問題