Изменение размера и многопоточность
Если вы обращаетесь к карте ha sh из одного потока, это не может произойти. Изменение размера запускается не таймером, а операцией, которая изменяет количество элементов в карте ha sh, например, она запускается операцией put () . Если вы позвоните put () и ha sh map увидит, что изменение размера необходимо, оно выполнит изменение размера, затем это будет ваш новый элемент. Означает, что новый элемент будет добавлен после изменения размера, ни один элемент не будет потерян, в любом из методов будет непоследовательное поведение.
Buf, если получить доступ к вашей карте ha sh из multiplic темы, то может быть много видов проблем. Например, если два потока вызывают put () одновременно, оба могут инициировать изменение размера. Одним из последствий может быть в том, что новый элемент одного из потоков будет потерян. Даже если изменение размера не требуется, многопоточность может привести к потере некоторых элементов. Например, два потока генерируют один и тот же индекс сегмента, и такого блока пока нет. Оба потока создают такой сегмент и добавляют его в массив блоков. Но самые последние выигрыши, другие будут отменены.
Ничто не указывает c на карту sh. Это типичная проблема, когда вы изменяете объект несколькими потоками. Чтобы правильно обрабатывать карты ha sh в многопоточной среде, вы можете либо реализовать синхронизацию, либо использовать класс, уже защищенный от потоков, ConcurrentHashMap .
Коэффициент загрузки
Элементы на карте ha sh хранятся в ведрах. Если каждый га sh соответствует одному индексу корзины, тогда время доступа составляет O (1) . Чем больше у вас хэшей, тем выше вероятность того, что два хэша выдают одинаковый индекс корзины. Затем они будут сохранены в том же контейнере, и время доступа увеличится на .
. Одним из решений для уменьшения таких коллизий является использование другой функции ha sh. Но 1) разработка функций ha sh, которые соответствуют определенным требованиям, может быть весьма нетривиальной задачей (помимо уменьшения коллизий, она должна обеспечивать приемлемую производительность), и 2) вы можете улучшить ha sh только в своих собственных классах, но не в библиотеках, которые вы используете.
Другое, более простое решение - использовать большее количество сегментов для того же количества хэшей. Когда вы уменьшаете соотношение (количество хэшей) / (количество сегментов) , вы уменьшаете вероятность коллизий и, таким образом, сохраняете время доступа близко к O (1) . Но цена в том, что вам нужно больше памяти. Например, для коэффициента загрузки 75% 25% массива сегментов не используются; при коэффициенте нагрузки 10% 90% не будут использоваться.
Не существует решения, подходящего для всех случаев. Попробуйте разные значения и измерьте производительность и использование памяти, а затем решите, что лучше в вашем случае.