3

不明な量のスレッドがサーバー上のコレクションに要素を追加するシナリオがあります。このコレクションのデータは並べ替える必要はなく、反復もされません。このコレクションでは、次の 2 つの単純な操作のみが機能します。

  1. 要素の追加 (場合によっては古い要素の削除)
  2. コレクションからすべての要素を読み取る (1 つずつではなく、コレクション全体をシリアル化してクライアントに送信するため。もちろん、要素を別のコレクションに移動して、後でシリアル化することもできます。)

このユースケースに最適なコレクションはどれですか? ConcurrentHashMap を選択しますが、この選択が適切かどうかはわかりません。

編集: 1 つの重要な要件を忘れていました: 特定の種類の要素が既にこのコレクションにあり、同じ種類の別の要素が追加された場合、新しい要素が追加される前に古い要素が削除されます。この要件のために、ハッシュ値を使用して検索を回避したいと考えました。格納されるオブジェクトは単純です。オブジェクトには、一意のユーザー名といくつかの文字列と int が含まれています。オブジェクトのユーザー名をキーとして使用する必要があります。

4

4 に答える 4

3

はい、ConcurrentHashMapこれに適しています。マップでは、ユーザー名をキー タイプ ( K) として使用し、関連するユーザー情報 (「一部の文字列と整数」) を値タイプ ( V) として使用します。put新しいキーと値のペアを追加removeしたり、キーと値のペアを削除したり、コンテナー内のすべてのキーと値のペアを取得したりするために使用entrySetします (「コレクションからすべての要素を読み取る」という意味であれば)。

于 2013-06-08T20:22:58.857 に答える
2

実際にはConcurrentSkipListSetを使用するのが最善だと思います。理由:

イテレータは一貫性が弱く、イテレータの作成時または作成後のセットの状態を反映する要素を返します。これらは ConcurrentModificationException をスローせず、他の操作と同時に処理を進めることができます。昇順のビューとそのイテレータは、降順よりも高速です。

これは、他の項目を追加しながら、リスト全体を調べてすべての項目を読み取ることができることを意味します。それは完全に同時です!

アイテムの追加には O(logN) 時間がかかることに注意してください。

于 2013-06-08T21:57:21.700 に答える
1

これは標準ライブラリの一部ではありませんが、この同時二重連結リストを使用できます。その反復子は一貫性が低く、 をスローしません。または、返された配列を使用してループConcurrentModificationExceptionできます。toArray

于 2013-06-08T15:58:16.127 に答える
1

java.util.concurrentには並行リストの実装があると思います。要件に役立つCopyOnWriteArrayList 。

または使用できます:

 List<Object> objList = Collections.synchronizedList(new ArrayList<Object>());
于 2013-06-08T15:53:44.417 に答える