Согласно документации ConcurrentHashMap Oracle,
Конструктор ConcurrentHashMap выглядит следующим образом:
общественного ConcurrentHashMap (INT initialCapacity, всплывают loadFactor, внутр concurrencyLevel)
Таким образом, выше линии создает новую, пустую карту с указанной начальной мощностью, коэффициентом загрузки и уровнем параллелизма. где Важные параметры, которые следует учитывать от ConcurrentHashMap Конструктора:
- initialCapacity - начальная емкость. Реализация выполняет внутренний размер для размещения этого множества элементов.
- concurrencyLevel - оценочное число одновременных обновлений потоков. Реализация выполняет внутреннюю калибровку, чтобы попытаться разместить это многопоточное число .
В ConcurrentHashMap Api вы найдете следующие константы.
- статический окончательный int DEFAULT_INITIAL_CAPACITY = 16;
- статический окончательный int DEFAULT_CONCURRENCY_LEVEL = 16;
Параметры начальной емкости и параметры уровня параллелирования конструктора ConcurrentHashMap (или объекта) по умолчанию установлены 16.
Таким образом, вместо общей блокировки карты ConcurrentHashMap по умолчанию хранит список из 16 блокировок (количество блокировок, равное начальной емкости, по умолчанию 16), каждый из которых используется для блокировки на одном ведре Map.This указывает, что 16 потоков (количество потоков, равное уровню параллелизма, которое по умолчанию 16) может изменять коллекцию одновременно, учитывая, что каждый поток работает в разных ведрах. Таким образом, в отличие от хэш-таблицы, мы выполняем любую операцию (обновление, удаление, чтение, создание) без блокировки всей карты в ConcurrentHashMap.
Операции поиска (включая получение) обычно не блокируются. В этом случае он использует концепцию изменчивости., поэтому могут перекрываться с операциями обновления (включая put и remove). Retrievals отражают результаты последних завершенных операций по обновлению с их началом.
Разрешенный параллелизм между операциями обновления управляется необязательным аргументом конструктора concurrencyLevel (по умолчанию 16), который используется как подсказка для внутреннего размера. Таблица внутренне разделена, чтобы попытаться разрешить указанное количество одновременных обновлений без конкуренции. Поскольку размещение в хэш-таблицах по сути является случайным, фактический параллелизм будет отличаться. В идеале вы должны выбрать значение для размещения столько потоков, сколько когда-либо одновременно измените таблицу. Использование значительно более высокой ценности, чем вам нужно, может тратить пространство и время, а значительно меньшее значение может привести к конфликту с потоком.
Надеюсь, это поможет!
hi..highlighted вопросы –
Итак, что вы имеете в виду между ConcurrentHashMap и ReadWriteLock? –