Как лучше всего реализовать параллельную хеш-карту в Java?



Эта статья познакомит вас с концепцией, называемой Concurrent Hash Map в Java, и последует практической демонстрацией.

Эта статья познакомит вас с концепцией, называемой Concurrent Hash Map In а затем проведите практическую демонстрацию. В этой статье будут рассмотрены следующие указатели.

Продолжаем эту статью о параллельной хэш-карте в Java





Как ConcurrentHashMap работает внутренне?

Начиная с Java 5, ConcurrentHashMap вводится как альтернатива HashTable. Мы также можем получить синхронизированную карту, используя метод служебного класса, называемый synchronizedMap (), но у этого метода есть недостаток, то есть очень низкая производительность, поскольку только один поток может получить к нему доступ одновременно. Итак, ConcurrentHashMap решает эти проблемы.



Продолжаем эту статью о параллельной хэш-карте в Java

Почему другая карта?

Несмотря на то, что у нас уже есть HashMap, HashTable, ConcurrentHashMap нужен потому, что он обеспечивает лучшую производительность и в то же время является потокобезопасным.

java когда использовать это

Продолжаем эту статью о параллельной хэш-карте в Java



Чем отличается?

Он также основан на хешировании, но его производительность улучшается за счет стратегии блокировки. В отличие от HashTable или Synchronized HashMap, он не применяет одну и ту же блокировку к каждому методу. Он использует отдельную блокировку для каждого метода. Для этой цели используется блокировка повторного входа. Подобно HashMap, ConcurrentHashMap имеет 16 сегментов, то есть сегментов, для создания ConcurrentHashMap с более чем 16 сегментами у него есть разные конструкторы.

Прежде чем говорить подробно, давайте рассмотрим несколько концепций ниже:

ConcurrentHashMap: эта карта разрешает одновременный доступ к потоку. Только часть карты, называемая сегментом, т.е. базовая структура данных, блокируется при добавлении или обновлении карты. Это позволяет параллельному потоку доступа для чтения данных без блокировки. Он был введен для повышения производительности.

  • Уровень параллелизма: это число, которое представляет собой приблизительное количество одновременно обновляемых потоков.
  • Load-Factor: это значение, которое используется для управления коэффициентом изменения размера.
  • Начальная емкость: это свойство, которое создает карту указанного размера.

Давайте посмотрим на диаграмму ниже и попытаемся понять, как работает ConcurrentHashMap.

Изображение - Параллельная карта хеширования - Edureka

Итак, на приведенной выше диаграмме у нас есть 16 блокировок, которые блокируют только часть карты, которая требуется для того, чтобы другие методы могли быть доступны для разных потоков, что улучшает производительность.

Подобно HashMap, ConcurrentHashMap работает аналогичным образом: по умолчанию он содержит 16 сегментов и сохраняет элемент путем хеширования, поэтому, если элементы имеют одинаковый хэш, они сохраняются в том же сегменте, как показано на диаграмме выше, с помощью связанного списка.

Продолжаем эту статью о параллельной хэш-карте в Java

Разница между ConcurrentHashMap и HashMap

HashMap принадлежит к коллекциям, а ConcurrentHashMap принадлежит к параллельным коллекциям, однако между ними есть много других различий.

  • ConcurrentHashMap - этоПоточно-ориентированный, т.е.синхронизирован, но HashMap не синхронизирован.
  • ConcurrentHashMap имеет низкую производительность, потому что он синхронизирован, потому что иногда потокам приходится ждать, но HashMap имеет высокую производительность, потому что он не синхронизирован, и любые потоки могут обращаться к нему одновременно.
  • Мы получим ConcurrentModificationException, если два потока одновременно пытаются изменить или добавить содержимое Object. Однако в случае ConcurrentHashMap мы не получим никаких исключений при выполнении той же операции.

  • Нулевые значения разрешены для ключа и значений в HashMap, однако ConcurrentHashMap не допускает нулевых значений для ключа и значения, которое он пытался добавить нулевое значение, мы получим исключение, т.е. NullPointerException.

  • HashMap представлен в JDK 1.2, тогда как ConcurrentHashMap представлен в JDK 1.5.

Как мы видели ранее, для повышения производительности он состоит из массива узлов в виде сегментов таблицы, которые были сегментами таблицы до Java 8 .

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

В сравнении с HashMap, ConcurrentHashMap предоставляет дополнительные concurrencyLevel аргумент для управления количеством предполагаемых потоков для использования.

Конструкторы:

  1. ConcurrentHashMap m = новый ConcurrentHashMap ()

    Создается новая пустая карта с начальной емкостью по умолчанию 16, коэффициентом загрузки 0,75 и уровнем параллелизма 16.

  2. ConcurrentHashMap m = новый ConcurrentHashMap (int initialCapacity)
    Создается новая пустая карта с указанной начальной емкостью, коэффициентом загрузки 0,75 и уровнем параллелизма 16.

  3. ConcurrentHashMap m = новый ConcurrentHashMap (int initialCapacity, float loadFactor)

    Создается новая пустая карта с указанной начальной емкостью и коэффициентом загрузки с уровнем параллелизма 16.

  4. ConcurrentHashMap m = новый ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Создается новая пустая карта с указанной начальной емкостью, коэффициентом загрузки и уровнем параллелизма.

  5. ConcurrentHashMap m = новая ConcurrentHashMap (карта m)
    Создает новый ConcurrentHashMap из предоставленной карты.

Два других аргумента: initialCapacity и loadFactor работали точно так же, как HashMap.
ConcurrentMap согласован с памятью при операциях «ключ-значение» в многопоточной среде.

Продолжаем эту статью о параллельной хэш-карте в Java

Ловушки

При получении объектов ConcurrentHashMap не блокируется и может перекрываться с операциями обновления, поэтому для повышения производительности они извлекают только последние завершенные операции обновления.

Результаты методов агрегированного состояния, включая size, isEmpty и containsValue, обычно полезны только тогда, когда карта не подвергается одновременным обновлениям в других потоках.

Если одновременные обновления контролируются должным образом, эти методы состояния могут быть надежными.

Хотя эти методы не гарантируют в реальном времени.

Емкость таблицы по умолчанию - 16, однако мы можем изменить ее, используя уровень параллелизма.

public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacity

Если ключи ключи должны быть в отсортированном порядке, мы можем использовать ConcurrentSkipListMap.

Теперь, после выполнения вышеуказанной программы, вы бы поняли Concurrent Hash Map в Java. На этом мы подошли к концу этой статьи. Если вы хотите узнать больше, ознакомьтесь с , надежная компания онлайн-обучения. Курс обучения и сертификации по Java J2EE и SOA от Edureka разработан, чтобы обучить вас базовым и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к этой статье, и мы свяжемся с вами как можно скорее.