4

servlet.Filterサーブレットにリクエストを送信する前に、IPアドレスに基づいてデータベース内のユーザーIDを検索する実装を作成しています。

データベースで検索されている同じIPアドレスからの要求がすでに存在する場合、フィルターが着信要求をマップのようなオブジェクトに隠しておく必要があります。次に、データベースから応答を受け取ったら、それをそのIPアドレスのすべての要求に適用し、サーブレットに送信します。

マップのようなオブジェクトは同期する必要がありますが、挿入順序も維持する必要があります。これにより、ユーザーIDを見つけると、すべての隠し要求が「受信された順序で処理される」ようになります。

APIを通過するLinkedHashMapと、順序は正常に維持されますHashTableが同期されません。は同期されますが、正しい順序を維持することを示すものはありません。

LinkedHashTableこれに使用できるオブジェクトはありますか?

私はJava6を使用しています。

4

5 に答える 5

10

を使用して、スレッドセーフなコンテナーでsynchronizedMap任意の実装をラップできます。Map

Map<K, V> synchronizedLinkedHashMap = Collections.synchronizedMap(new LinkedHashMap<K, V>());

ConcurrentSkipListMap要素を で並べたい場合は、 を使用することもできますComparator

于 2012-07-31T17:29:22.747 に答える
1

を使用Collections#synchronizedMap(Map)して渡すことでうまくいきますLinkedHashMapか?それが最も簡単な方法です。

更新: Guava をMapMaker何らかの形で活用することもできるかもしれませんが、100% 正しいとは思いません。

于 2012-07-31T17:29:38.037 に答える
1

java.util.Collections.synchronizedMap(...)でラップすることにより、基になるマップを同期させることができます。

したがって、次のようにします。

Map m = Collections.synchronizedMap(new LinkedHashMap());
于 2012-07-31T17:29:10.820 に答える
1

任意のマップ/コレクションを同期させることができます:

Map<...> m = Collections.synchronizedMap(new LinkedHashMap());

synchronizedSet()などsynchronizedList()がありsynchronizedSortedMap()ます。

于 2012-07-31T17:31:19.617 に答える
0

1.マップ間で同期されたマップでHashTableある を使用する

2.も使用できますConcurrentHashMap

于 2012-07-31T17:28:53.933 に答える