Как в ConcurrentHashMap работают две операции чтения одного и того же сегмента одновременно?

Я пытаюсь понять, как операция чтения работает внутри HashTable, HashMap и ConcurrentHashMap. ConcurrentHashMap внутренне разделен на сегменты размером 32. Таким образом, одновременно могут читаться не более 32 потоков. Что происходит, когда мы получаем две операции чтения в одном и том же сегменте в одно и то же время в ConcurrentHashMap.

Кроме того, я хотел бы знать, как работает многократное чтение одного и того же элемента в HashTable, HashMap?


person Krishan    schedule 14.03.2021    source источник
comment
В прошлом, то есть до Java 8, ConcurrentHashMap использовал настраиваемое количество сегментов, а не «сегменты размером 32».   -  person Holger    schedule 15.03.2021


Ответы (1)


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