HashMap против. ConcurrentHashMap против. SynchronizedMap — как можно синхронизировать HashMap в Java

Опубликовано: 2015-01-29

Crunchify ConcurrentHashMap против. Пример SynchronizedMap HashMap — очень мощная структура данных в Java. Мы используем его каждый день и почти во всех приложениях. Есть довольно много примеров, которые я написал ранее: Как реализовать кеш Threadsafe, Как преобразовать Hashmap в Arraylist?

Мы использовали Hashmap в обоих приведенных выше примерах, но это довольно простые варианты использования Hashmap. HashMap is a non-synchronized класс коллекции.

У вас есть какие-либо из приведенных ниже вопросов?

  • В чем разница между ConcurrentHashMap и Collections.synchronizedMap(Map)?
  • В чем разница между ConcurrentHashMap и Collections.synchronizedMap(Map) с точки зрения производительности?
  • ConcurrentHashMap против Collections.synchronizedMap()
  • Популярные вопросы интервью HashMap и ConcurrentHashMap

В этом уроке мы рассмотрим все вышеперечисленные вопросы и объясним, why and how мы можем синхронизировать Hashmap?

Почему?

Объект Map представляет собой ассоциативные контейнеры, в которых хранятся элементы, образованные комбинацией key уникальной идентификации и отображаемого value . Если у вас очень параллельное приложение, в котором вы можете изменить или прочитать значение ключа в разных потоках, идеально использовать Concurrent Hashmap. Лучшим примером является Producer Consumer, который обрабатывает одновременное чтение/запись.

Так что же означает поточно-безопасная карта? Если multiple threads обращаются к хэш-карте и по крайней мере один из потоков структурно изменяет карту, она must be synchronized externally , чтобы избежать несогласованного представления содержимого.

Как?

Есть два способа синхронизировать HashMap.

  1. Метод синхронизированной карты Java Collections ()
  2. Использовать ConcurrentHashMap

ConcurrentHashMap

  • Вы должны использовать ConcurrentHashMap, когда вам нужен очень высокий параллелизм в вашем проекте.
  • Это потокобезопасно без синхронизации whole map .
  • Чтение может происходить очень быстро, в то время как запись выполняется с блокировкой.
  • Нет блокировки на уровне объекта.
  • Блокировка осуществляется с гораздо большей степенью детализации на уровне корзины хэш-карты.
  • ConcurrentHashMap не генерирует ConcurrentModificationException , если один поток пытается изменить его, пока другой выполняет итерацию.
  • ConcurrentHashMap использует множество блокировок.

SynchronizedHashMap

  • Синхронизация на уровне объекта.
  • Каждая операция чтения/записи должна получать блокировку.
  • Блокировка всей коллекции приводит к снижению производительности.
  • По сути, это дает доступ только одному потоку ко всей карте и блокирует все остальные потоки.
  • Это может вызвать конфликт.
  • SynchronizedHashMap возвращает Iterator , который быстро дает сбой при параллельной модификации.

Теперь давайте посмотрим на код

  1. Создайте класс CrunchifyConcurrentHashMapVsSynchronizedHashMap.java
  2. Создайте объект для каждой HashTable, SynchronizedMap и CrunchifyConcurrentHashMap.
  3. Добавить и получить 500 тыс. записей с карты
  4. Измерение времени начала и окончания и отображение времени в миллисекундах
  5. Мы будем использовать ExecutorService для параллельного запуска 5 threads .

Вот код Java:

  • shutdown() означает, что служба-исполнитель больше не принимает входящие задачи.
  • awaitTermination() вызывается после запроса на завершение работы.

И, следовательно, вам нужно сначала отключить serviceExecutor, а затем заблокировать и дождаться завершения потоков.

Результат консоли Eclipse: