ConcurrentHashMap внутренне разделен на сегменты размером 32. Таким образом, одновременно могут читаться не более 32 потоков.
Это неправильно. Согласно документации ConcurrentHashMap, операции извлечения не влекут за собой блокировку [выделено в оригинале]. Это означает, что произвольное количество потоков может читать карту одновременно. (Примечание: приведенная выше ссылка ведет на документацию для последней версии Java, но то же самое относится и ко всем версиям. Вышеупомянутое утверждение существует с тех пор, как документация для JDK 1.5, которая была начальной версией, в которой был представлен ConcurrentHashMap.)
Даже для обновлений, которые действуют с блокировкой, это утверждение неверно: ConcurrentHashMap не разбивается на сегменты, начиная с Java 7; раньше, когда он был разделен на сегменты, для параллелизма имело значение количество сегментов, а не их размер; количество сегментов настраивалось пользователем; и количество сегментов по умолчанию было 16, а не 32.
Кроме того, я хотел бы знать, как работает многократное чтение одного и того же элемента в HashTable, HashMap?
Hashtable.get блокирует всю карту, поэтому не имеет значения, выполняется ли параллельное чтение одного и того же элемента или разных; в любом случае, одно блокирует другое.
HashMap не беспокоится о параллелизме; несколько потоков могут успешно читать карту одновременно, но небезопасно иметь обновления одновременно с чтением или другими обновлениями.
person
ruakh
schedule
15.03.2021
ConcurrentHashMap
использовал настраиваемое количество сегментов, а не «сегменты размером 32». - person Holger   schedule 15.03.2021