Внутренняя работа HashMap и ConcurrentHashMap

Я несколько запутался в своем понимании, когда в викторине меня спросили следующие вещи:

1)ConcurrentHashMap: Насколько я понимаю, нет блокировки для получения значений (соответствующих ключу) с этой карты. Вопрос: если это правда, предположим, что t1 пишет (путем блокировки сегмента/ведра), а t2 пытается прочитать то же самое, t2 не получит правильное значение и, следовательно, несовместимое значение с t2

2)HashMap: Насколько я понимаю, перед добавлением элемента в хешбакет хеш-значение H вычисляется как хэш-код% 16 (дает значения от 0 до 15) для ключа (key.hashcode( )) и затем добавляется в корзину, хэш-значение которой равно H. Примечание. Существует 16 групп (реализация по умолчанию), что представляет собой ArrayList из LinkedList


|0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 | 11 |12 |13 |14 |15 |


ArrayList в 2000 (адрес памяти)

Вы вполне можете сказать, что это дубликат сегментации в ConcurrentHashMap, Относительно внутренней работы параллельного hashmap, HashMap или ConcurrentHashMap на контроллерах Java? и т. д. Но мне нужно разобраться в сомнениях. несколько ссылок/блогов с хорошим объяснением будут работать для меня. Спасибо


person Learner    schedule 07.04.2013    source источник
comment
Не запутайтесь. Здесь вы лучше поймете dzone. ком/статьи/   -  person Ganesh Chowdhary Sadanala    schedule 01.10.2018


Ответы (1)


Используйте эту ссылку для изучения ConcurrentHashMap и HashMap

Для 1-й части. То, что вы говорите, правильно. Метод get() не блокирует сегмент, если находит ключ в ConcurrentHashMap. Если у вас есть другой поток, который изменяет структуру карты (например, put()), и он еще не завершен, он уверен, что вы получите устаревшие значения. Но он не вызовет исключение ConcurrentModificationException. Обновленные значения будут отражены, если операция изменения завершится до операции извлечения.

Надеюсь, это поможет.

person Abhishek Sahu    schedule 08.06.2013