4

我正在创建一个servlet.Filter实现,其中在将请求发送到 servlet 之前,我根据 IP 地址在数据库中查找用户 ID。

如果已经有来自同一 IP 地址的请求正在数据库中查找,我希望我的过滤器将传入请求存储到类似地图的对象中。然后,当我从数据库中获得响应时,我会将其应用于对该 IP 地址的所有请求,并将它们发送到 servlet。

类似地图的对象需要同步,但也需要维护插入顺序,以便一旦我找到用户 ID,所有隐藏的请求“将按照接收到的顺序进行处理”。

通过API,有一个LinkedHashMap可以很好地维持订单但不同步,它HashTable是同步的但没有给出任何迹象表明它将保持正确的顺序。

LinkedHashTable我可以使用某种对象吗?

我正在使用 Java 6。

4

5 回答 5

10

您可以使用synchronizedMap将任何Map实现包装在线程安全容器中:

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

ConcurrentSkipListMap如果您想使用 a 对元素进行排序,也可以使用a Comparator

于 2012-07-31T17:29:22.747 回答
1

您可以通过使用java.util.Collections.synchronizedMap(...)包装任何底层地图来同步它

所以,你会这样做:

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

您可以使用Collections#synchronizedMap(Map)并传递它LinkedHashMap吗?这是最简单的方法。

更新:您也许还可以以某种方式利用GuavaMapMaker,但我认为这不是 100% 正确的。

于 2012-07-31T17:29:38.037 回答
1

您可以使任何地图/集合同步:

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

synchronizedSet()synchronizedList()等等,甚至还有synchronizedSortedMap()

于 2012-07-31T17:31:19.617 回答
0

1.使用HashTable,即Maps之间同步的Map

2.你也可以使用ConcurrentHashMap.

于 2012-07-31T17:28:53.933 回答