2012-07-31 26 views
4

我正在创建一个servlet.Filter实现,其中我在将请求发送到servlet之前,根据IP地址在数据库中查找用户标识。是否有一个同步的AND排序映射对象(LinkedHashTable)?

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

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

通过API浏览器有一个LinkedHashMap这将保持顺序良好,但不同步,HashTable是同步的,但没有给出任何迹象表明它会保持正确的顺序。

是否有某种LinkedHashTable对象可用于此?

我使用Java 6

+2

你想要它被排序似乎暗示你想迭代它?请记住,简单地同步一个Map *不会使其在并发环境中的迭代安全。 – Affe 2012-07-31 17:31:51

回答

7

您可以使用synchronizedMap封装任意Map实现在一个线程安全的容器:

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

如果您想订购元素wi,您也可以使用ConcurrentSkipListMap th Comparator

+0

This,SkipList,简单地同步地图并不会让它神奇地“安全”并发使用。 – Affe 2012-07-31 17:33:13

+0

@Affe因此'SkipList'会处理你在评论中提到的并发迭代问题吗? – Geronimo 2012-07-31 17:35:08

+0

@Geronimo'synchronizedMap'也可以处理并发迭代问题。正如文档所述,您需要在迭代任何集合视图时同步返回的“Map”实例。 – Jeffrey 2012-07-31 17:35:58

0

使用HashTable,这是地图

2.您还可以使用ConcurrentHashMap之间同步的Map。

1

你可以通过使用Collections#synchronizedMap(Map)并通过LinkedHashMap?这是最简单的方法。

更新:您也可以以某种方式利用Guava's MapMaker,但我不认为它是100%的点。

1

你可以做任何地图/集同步:

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

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

相关问题