Какой лучший способ выбрать уровень параллелизма для ConcurrentHashMap? - PullRequest
1 голос
/ 10 мая 2019

Я пытался понять, как работает уровень параллелизма ConcurrentHashMap (третий аргумент его конструктора), и читал эту статью - https://dzone.com/articles/how-concurrenthashmap-works-internally-in-java.В частности, он определяет уровень параллелизма как

. Определяет число, являющееся оценочным числом одновременно обновляемых потоков.Реализация выполняет внутреннее определение размера, чтобы попытаться вместить столько потоков.

Затем она определяет способ выбора сегмента, используя

Segment seg = segments[(hash & 0x1F)];

, где "хэш" - это хэш-кодвставляемый объектМой вопрос заключается в том, что, поскольку вы не всегда можете предсказать значение хэша вставленных объектов, возможно ли, что если у вас уровень параллелизма 16, теоретически вы можете попасть в ситуацию, когда все объекты вставляются в один и тот же сегмент?Если да, имеет ли смысл всегда выбирать количество сегментов в зависимости от того, сколько потоков может получить доступ к структуре данных, или есть лучший способ выбрать уровень параллелизма?

1 Ответ

0 голосов
/ 10 мая 2019

Когда вы используете свои собственные объекты в качестве ключей карты, вы полностью контролируете реализацию hashCode.Например, вы можете определить его как постоянное значение 0 для всех экземпляров ваших ключей.Это действительная (и очень неудачная) функция хеширования.Имея это в виду, да, могут быть ситуации, когда все объекты вставляются в один и тот же сегмент и даже в один и тот же бин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...