Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Претензию издателям передал
Блокировка всех мьютексов здесь важна, чтобы никто не помешал нам сделать rehashing.
Если мне не изменяет память, там внутри блокировки и довольно изощренный механизм их применения, а желаемый уровень конкуренции задается в конструкторе. Насчет расширения массива блокировок — см. ремарку о refinable hash map.Задание concurrencyLevel = читай, количество локов (striping factor если хотите) было в версиях JDK5-7, и алгоритм был как раз прост. Вот начиная с JDK 8, он стал гораздо сложнее и лучше, а concurrencyLevel, хотя остался как параметр для совместимости, теперь фактически игнорируется.
PauselessHashMap — прочитал анонс, не понял, в чем там конкурентность. В том, что мы должны сами блокировать извне, если она необходима?.. Автор, как я понял, не заявляет о том, что его класс является concurrent hash map.Да, не конкурентный, я хотел заметить, что есть некие идеи, которые наверняка можно совместить и с concurrentMap на локах, и lock-free.
Вообще, я уже не раз отмечал, что Java-алгоритмы иногда трудно переносить на C++ «с листа» — многое, чего нет в C++, в Java встроено, — например, GC, synchronized.Ни то ни другое не имеет решающего значения для данной алгоритма, при желании, его вполне можно перенести на любой язык.
Да, не конкурентный, я хотел заметить, что есть некие идеи, которые наверняка можно совместить и с concurrentMap на локах, и lock-free.
По результатам моих экспериментов, хорошим значением load factor является 2 – 4, то есть каждый lock-free список коллизий в среднем содержит 2 – 4 элемента. При load factor = 1 (список коллизий состоит из одного элемента в среднем) результаты чуть лучше, но больше накладные расходы по памяти на фактически вырожденные списки коллизий.
Я бы с большой осторожностью давал такие оценки
Кстати, в исходниках у вас вроде size_t load factor, не unsigned int.
Lock-free структуры данных. Concurrent map: разминка