Конкретное использование Hashtable вместо ConcurrentHashMap

ConcurrentHashMap был представлен в версии 1.5 как часть пакета Java java.util.concurrent. До этого единственным способом получить карту threadsafe было использование HashTable или Collections.synchronizedMap(Map).

Для всех практических целей (многопоточная среда) ConcurrentHashMap достаточно для удовлетворения потребностей, за исключением одного случая, когда потоку требуется однородное представление карты.

Мой вопрос заключается в том, что, кроме единообразного представления карты, существуют ли какие-либо другие сценарии, в которых ConcurrentHashMap не подходит?


person Santosh    schedule 17.08.2012    source источник
comment
Вы можете столкнуться с некоторыми случаями, когда один или другой менее эффективен, чем вам требуется. Возможно при большой нагрузке. Однако вам нужно будет измерить эти вещи.   -  person Bill    schedule 17.08.2012
comment
Что такое единый вид? Не могли бы вы объяснить...   -  person yegor256    schedule 17.08.2012
comment
@ yegor256 yegor256, единое представление — это представление записей карты, которое не меняется, когда поток обращается к этой конкретной карте.   -  person Santosh    schedule 17.08.2012


Ответы (3)


Это натяжка, но я приведу ее как вариант использования.

Если вам нужна поточно-безопасная реализация Map, в которой вы можете выполнять дополнительную составную операцию, недоступную через ConcurrentMap. Допустим, вы хотите убедиться, что два других объекта не существуют, прежде чем добавлять третий.

Hashtable t = new Hashtable();

synchronized(t){
   if(!t.contains(object1) && !t.contains(object2)){
      t.put(object3,object3);
   }
}

Опять же, это натяжка, но вы не сможете добиться этого с помощью CHM, обеспечив атомарность и безопасность потоков. Поскольку все операции Hashtable и его части synchronizedMap синхронизируются с экземпляром карты, это обеспечивает потокобезопасность.

В конце концов, я бы редко, если вообще когда-либо, использовал synchronizedMap/Hashtable, и я предлагаю вам сделать то же самое.

person John Vint    schedule 17.08.2012

Использование Hashtable не рекомендуется начиная с Java 1.2, а полезность synchronizedMap довольно ограничена и почти всегда оказывается недостаточной из-за слишком мелкой детализации блокировки. Однако, когда у вас есть сценарий, в котором отдельные обновления имеют необходимый вам размер зернистости, ConcurrentHashMap — это лучший выбор, чем synchronizedMap. Он имеет лучший параллелизм, потокобезопасные итераторы (нет, synchronizedMap не имеет их, это связано с его дизайном как обертка вокруг не потокобезопасной карты), лучшую общую производительность и очень мало дополнительный вес памяти, чтобы заплатить за все это.

person Marko Topolnik    schedule 17.08.2012

Насколько я понимаю, ConcurrentMap является заменой HashTable и Collections.synchronizedMap() для поточно-ориентированных целей. Использование всех этих классов не рекомендуется. Таким образом, ответ на ваш вопрос "нет, других сценариев нет".

См. также: В чем разница между ConcurrentHashMap и Collections.synchronizedMap(Map)?

person yegor256    schedule 17.08.2012