2012-07-31 58 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()

相關問題