2013-08-01 4 views
2

Во-первых, я опишу, что хочу, а затем я расскажу о возможностях, которые я рассматриваю. Я не знаю, что лучше, поэтому мне нужна помощь.Реализация сейфа для хэш-карты

У меня есть карта хэша, на которой я читаю и записываю операции с Servlet. Теперь, поскольку этот Servlet находится на Tomcat, мне нужна карта хэша, чтобы быть потокобезопасной. В принципе, когда он записывается, ничто другое не должно писать ему, и ничто не должно его читать.

Я видел ConcurrentHashMap, но заметил, что его метод получения не является потокобезопасным. Затем я видел блокировки и что-то называемое синхронизированным.

Я хочу знать, какой из них является самым надежным способом.

+9

Каким образом ConcurrentHashMap.get не является потоковым? И какой уровень детализации вы ищете? Под «когда оно написано» вы имеете в виду, что будут выполняться * множественные операции ввода или достаточно, чтобы каждый из них был атомарным? –

+0

Увидев документ API, я думал, что он не является потокобезопасным. Для хэш-карты может быть многопозиционная операция, если, скажем, 3 человека решили сделать одно и то же действие. – pratnala

+2

@pratnala Тот факт, что он позволяет выполнять параллельные операции, не делает его безопасным для потоков. – assylias

ответ

3

EDIT: убрана ложной информации

В любом случае synchronized ключевое слово является безопасным выбором. Он блокирует любые потоки от доступа к объекту, находясь внутри блока synchronized.

// Anything can modify map at this point, making it not thread safe 
map.get(0); 

в отличие от

// Nothing can modify map until the synchronized block is complete 
synchronized(map) { 
    map.get(0); 
} 
+0

В контейнере есть только один экземпляр каждого «сервлета». Все сопоставленные запросы будут проходить через один и тот же экземпляр. Если у вас есть поля экземпляра, каждый запрос будет иметь к ним доступ. –

+0

Запросы выполняются в разных потоках, то есть 'service()' метод сервлетов может выполняться одновременно (если только Servlet не объявлен как SingleThreadModel), хотя есть один экземпляр сервлета. Следовательно, переменная экземпляра, объявленная в классе Servlet, может быть вызвана из нескольких потоков обработки запросов. –

+0

Ack. Вы (оба) правильно, я не знаю, о чем я думал. Я думал, что мы (на работе) опровергли это с помощью ряда тестов. Я удалю эту часть своего ответа. – Deactivator2

3

Collections.synchronizedMap(new HashMap<K, V>);

Возвращает синхронизированное (потокобезопасный) отображение подкрепленного указанной карты. Чтобы гарантировать последовательный доступ, крайне важно, чтобы весь доступ к карте поддержки осуществлялся через возвращаемую карту.

Крайне важно, чтобы пользователь вручную синхронизировать на возвращаемом карте при переборе по любому из его взглядов коллекции:

+0

Что вы подразумеваете под «критически важно, чтобы весь доступ к упорядоченной карте поддержки выполнялся с помощью возвращенной сортированной карты»? – pratnala

+0

скопировал описание Collection.synchronizedSortedMap() по ошибке, тем самым я имел в виду, что карта, в которой вы проходили, по-прежнему не будет threadafe –

+0

Я до сих пор не понимаю описания. – pratnala

16

ConcurrentHashMap.get() является поточно.

Вы можете сделать HashMap нить безопасной, обернув ее Collections.synchronizedMap().

+0

В чем разница? – naXa

+0

@naXa ConcurrentHashMap позволяет одновременный доступ, а «синхронизированный» - нет. –

2

Я хотел бы предложить вам пойти с ConcurrentHashMap, требование, что вы уже упоминали выше, раньше я был один и тот же тип требования для нашего приложения, но мы были немного больше сосредоточены на стороне эффективности.

Я побежал как ConcurrentHashMap и карты, возвращаемый Colecctions.synchronizedMap();, при различных типах нагрузки и запуск нескольких потоков одновременно с помощью JMeter и я контролировать их с помощью JProfiler .После всех этих тестов мы пришли к выводу, что эта карта возвращаемый Colecctions.synchronizedMap() был не столь эффективны с точки зрения производительности в comaprison до ConcurrentHashMap.

Я написал post также и о моем опыте с обоими.

Благодаря

0

Это точка класса ConcurrentHashMap. Он защищает вашу коллекцию, если у вас более 1 потока.

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

  • Нет связанных вопросов^_^