Подтвердить что ты не робот

Параметр ConcurrentHashMap-конструктора?

Мне интересно узнать параметры для построения ConcurrentHashMap:

  • initialCapacity по умолчанию 16 (понимается).
  • loadFactor по умолчанию равен 0,75.
  • concurrencyLevel по умолчанию - 16.

Мои вопросы:

  • Какие критерии следует использовать для настройки loadFactor вверх или вниз?
  • Как установить количество одновременных обновлений потоков?
  • Какие критерии следует использовать для настройки concurrencyLevel вверх или вниз?

Дополнительно:

  • Каковы отличительные черты реализации хорошего хэш-кода? (Если вопрос SO отвечает на это, просто связывайтесь с ним.)

Спасибо!

4b9b3361

Ответ 1

Короткий ответ: установите "начальную емкость" примерно на количество отображений, которые вы ожидаете положить на карту, и оставьте остальные параметры по умолчанию.

Длинный ответ:

  • коэффициент нагрузки - это соотношение между количество "ковшей" на карте и количество ожидаемых элементов;

  • 0,75 обычно является разумным компромиссом - как я помню, это означает, что с хорошая хэш-функция, в среднем мы ожидайте от 1.6 перенаправления, чтобы найти элемент на карте (или вокруг этой фигуры);

    • изменение нагрузки фактор изменяет компромисс между больше перенаправления для поиска элемента, но меньше потраченного впустую пространства - положите 0,75 действительно обычно хорошая ценность;

    • в принципе, установите ConcurrencyLevel на количество одновременных потоков, которые вы ожидают изменения карты, хотя переоценка этого не похоже, плохой эффект другой чем тратить память (я написал немного on Производительность ConcurrentHashMap Некоторое время назад, если вы интересно)

Неформально ваша хеш-функция должна по существу стремиться к тому, чтобы как можно больше "случайности" в битах. Или, более строго, хэш-код для данного элемента должен давать каждому бит примерно 50% вероятности установки. На самом деле проще проиллюстрировать это на примере: снова вас может заинтересовать какой-то материал, который я написал о как работает хеш-функция String и связанная с ним рекомендации хэш-функции. Обратная связь - это obvioulsy приветствовать любой из этих вещей.

Одна вещь, о которой я также упоминаю в какой-то момент, заключается в том, что на практике вам не нужно быть слишком параноидальным: если ваша хеш-функция создает "разумное" количество случайности в некоторых битах, тогда это часто будет ОК. В худшем случае прилипание репрезентативных фрагментов данных в строку и принятие хеш-кода строки на самом деле не работает так плохо.

Ответ 2

Фактор нагрузки в первую очередь связан с качеством хэш-функции. Чем ближе к нулю коэффициент нагрузки, тем меньше вероятность столкновения, даже если хеш-функция не так велика. Компромисс в том, что объем памяти больше. Другими словами, HashMap не распределяет записи в отдельных ведрах для каждого отдельного хэш-кода, он группирует их по близости, поэтому чем больше ведер, тем больше распространяется распределение, тем меньше вероятность столкновения.

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

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

Реализация качественного хэш-кода обеспечивает как можно более широкое распределение по потенциальным значениям объекта с наименьшим количеством столкновений при соблюдении контракта. Другими словами, он позволяет HashMap (или, например, Set) распространять объекты на отдельные ковши, что ускоряет поиск.

Ответ 3

loadFactor: управляет, когда реализация решает изменить размер хэш-таблицы. Слишком высокая ценность будет пустым пространством; слишком низкое значение приведет к дорогостоящим операциям изменения размера.

concurrencyLevel: сообщает реализации, чтобы попытаться оптимизировать для данного количества потоков писем. Согласно документам API, выключение до 10 раз не должно сильно влиять на производительность.

Разрешенный concurrency среди обновлений операции руководствуются необязательным Аргумент конструктора concurrencyLevel (по умолчанию 16), который используется как подсказка для внутренней калибровки. Таблица внутренне разделены, чтобы попытаться разрешить указанное количество одновременные обновления без раздумий. Поскольку размещение в хэш-таблицах по существу случайный, фактический concurrency будет отличаться. В идеале вы следует выбрать значение для размещения столько же потоков, сколько и когда-либо одновременно изменять таблицу. Используя значительно выше, чем вы потребность может тратить пространство и время, и значительно меньшее значение может привести к обсуждение разногласий. Но переоценивает и недооценивает в порядке как правило, не так много заметное воздействие.

Хорошая реализация hashcode будет равномерно распределять значения хэш-функции по любому интервалу. Если набор ключей известен заранее, можно определить "идеальную" хеш-функцию, которая создает уникальное хеш-значение для каждой клавиши.

Ответ 4

loadFactor по умолчанию установлен в 0.75, какие критерии следует использовать для это вверх или вниз?

Вам нужно знать, как работают хэш-карты, прежде чем вы сможете понять, как это работает. Карта по существу представляет собой ряд ведер. Каждое значение на карте помещается в ведро в зависимости от того, что его хэш-код. LoadFactor означает, что если ведра заполнены более чем на 75%, необходимо изменить размер карты

Параметр concurrencyLevel равен 16 по умолчанию, как мы устанавливаем количество одновременных обновлений потоки? Какие критерии следует использовать отрегулировать это вверх или вниз?

Это спрашивает, сколько потоков вам потребуется изменить Карту одновременно (одновременно)

Для хэш-кодов см. Joshua Bloch Эффективная Java