我正在创建一个servlet.Filter
实现,其中我在将请求发送到servlet之前,根据IP地址在数据库中查找用户ID。
我希望我的过滤器将传入的请求存储到类似地图的对象中,如果已经有来自在数据库上查找的同一 IP 地址的请求。然后,当我从数据库获得响应时,我会将其应用于对该 IP 地址的所有请求,并在将它们发送到 servlet 的途中发送。
类似地图的对象需要同步,但也要保持广告顺序,以便在我找到用户 ID 后,所有隐藏的请求"将按照接收顺序进行处理"。
通过 API,有一个LinkedHashMap
可以保持订单良好但不同步,HashTable
是同步的,但没有给出任何指示它会保持正确的顺序。
我可以使用某种LinkedHashTable
对象吗?
我正在使用Java 6。
synchronizedMap
将任何Map
实现包装在线程安全容器中:
Map<K, V> synchronizedLinkedHashMap = Collections.synchronizedMap(new LinkedHashMap<K, V>());
如果要使用Comparator
对元素进行排序,也可以使用ConcurrentSkipListMap
。
您可以通过用java.util.Collections.syncdMap(...(包装任何底层映射来同步
因此,您将执行以下操作:
Map m = Collections.synchronizedMap(new LinkedHashMap());
你能使用Collections#synchronizedMap(Map)
并传递它一个LinkedHashMap
吗?这是最简单的方法。
更新:你也可以以某种方式利用Guava的MapMaker
,但我认为这不是100%正确的。
您可以同步任何地图/集合:
Map<...> m = Collections.synchronizedMap(new LinkedHashMap());
有synchronizedSet()
,synchronizedList()
等等,甚至还有synchronizedSortedMap()
.
1. 使用 HashTable
,这是地图之间的同步地图
2.您也可以使用ConcurrentHashMap
。