В чем разница между ConcurrentHashMap и Hashtable в Java?
Что более эффективно для поточных приложений?
В чем разница между ConcurrentHashMap и Hashtable в Java?
Что более эффективно для поточных приложений?
ConcurrentHashMap
использует несколько ведер для хранения данных. Это позволяет избежать блокировки чтения и значительно повышает производительность по сравнению с HashTable
. Оба являются потокобезопасными, но есть очевидные победы в производительности с ConcurrentHashMap
.
Когда вы читаете с ConcurrentHashMap
с помощью get()
, нет никаких блокировок, в отличие от HashTable
, для которых все операции просто синхронизируются.
HashTable
был выпущен в старых версиях Java, тогда как ConcurrentHashMap
является Java + 5+.
HashMap
- лучшее, что можно использовать в однопоточном приложении.
ConcurrentHashMap и механизм блокировки Hashtable
Hashtable
принадлежит структуре Collection; ConcurrentHashMap
относится к структуре Executor.Hashtable
использует единую блокировку для целых данных. ConcurrentHashMap
использует несколько блокировок на уровне сегмента (по умолчанию 16) вместо уровня объекта, т.е. всей Map
.ConcurrentHashMap
применяется только для обновлений. В случае поиска, он позволяет полностью совместить, результаты поиска отражают результаты последних завершенных операций обновления. Поэтому чтение может происходить очень быстро, в то время как записи выполняются с помощью блокировки.ConcurrentHashMap
не выдает ConcurrentModificationException
если один поток пытается изменить его, а другой выполняет итерацию по нему и не допускает нулевые значения.ConcurrentHashMap
возвращает Iterator
, который является отказоустойчивым (т.е. итератор сделает копию внутренней структуры данных) при одновременной модификации.ConcurrentHashMap
использует логику разбиения базы данных (Segment<K, V>[] segments
) известен как уровень параллелизма, то есть делит данные на осколки (сегменты), чем ставит блокировки на каждый осколок (сегмент) вместо того, чтобы помещать единую блокировку для целого данные (Map
). Значение по умолчанию - 16.Чтобы лучше понять ConcurrentHashMap, посмотрите эту ссылку
Следующая аналогия помогает вам понять только концепцию (а не логику)
Hashtable
и ConcurrentHashMap
- это два типа домов.Hashtable
блокирует главную главную дверь.ConcurrentHashMap
блокирует конкретную дверь комнаты вместо главной двери.Что более эффективно для резьбовых приложений?
ConcurrentHashMap
более эффективен для поточных приложений.