2012-07-31 2 views
4

Я создаю реализацию servlet.Filter, в которой я ищу идентификатор пользователя в базе данных на основе IP-адреса перед отправкой запроса на сервлет.Есть ли синхронизированный И отсортированный объект карты (LinkedHashTable)?

Я хочу, чтобы мой фильтр помещал входящие запросы в объект, похожий на карту, если уже есть запрос с того же IP-адреса, который просматривается в базе данных. Затем, когда я получаю ответ от базы данных, я буду применять его ко всем запросам на этот IP-адрес и отправить их по пути к сервлету.

Объект, похожий на карту, должен быть синхронизирован, но также поддерживать порядок вставки, так что, как только я нахожу идентификатор пользователя, все запрошенные «запросы будут обрабатываться в том порядке, в котором они были получены».

Пройдя через API, есть LinkedHashMap, который будет поддерживать порядок в порядке, но не синхронизирован, синхронизирован HashTable, но не дает никаких указаний на то, что он будет поддерживать правильный порядок.

Есть ли какой-то объект LinkedHashTable, который я могу использовать для этого?

Я использую Java 6.

+2

Что вы хотите, чтобы оно было заказано, кажется, подразумевает, что вы хотите его повторить? Имейте в виду, что простая синхронизация карты * не позволяет безопасно итерации в параллельной среде. – Affe

ответ

7

Вы можете использовать synchronizedMap обернуть любую Map реализации в поточно-контейнере:

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

Вы также можете использовать ConcurrentSkipListMap, если хотите заказать свои элементы wi th a Comparator.

+0

Это, SkipList, просто Синхронизация карты не делает ее магически «безопасной» для одновременного использования. – Affe

+0

@Affe Итак, 'SkipList' будет обрабатывать проблему параллельной итерации, упомянутую в комментарии? – Geronimo

+0

@ Geronimo 'synchronizedMap' также может обрабатывать проблему параллельной итерации.Как указано в документации, вам нужно синхронизировать с возвращенным экземпляром «Карта», когда вы перебираете любые виды своих коллекций. – Jeffrey

0

1. Используйте HashTable, который является синхронизированным Карта среди Карты

2. Вы также можете использовать ConcurrentHashMap.

1

Вы можете сделать любую основную карту синхронизированной, окружив его с java.util.Collections.synchronizedMap(...)

Итак, вы могли бы сделать:

Map m = Collections.synchronizedMap(new LinkedHashMap()); 
1

Вы можете пройти мимо с помощью Collections#synchronizedMap(Map) и передать его LinkedHashMap? Это самый простой способ.

UPDATE: Возможно, вы также сможете использовать Guava's MapMaker, но я не думаю, что он на 100% включен.

1

Вы можете сделать любую карту/коллекция синхронизирована:

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

Там в synchronizedSet(), synchronizedList() и т.д., есть даже synchronizedSortedMap().

Смежные вопросы