2015-09-01 4 views
4

Я понимаю, что в HashMap записи (Key, Value) помещаются в ведра на основе хэша (Key.hashCode) -> Индекс, обозначающий местоположение ведра. В случае, если запись уже размещена в этом месте, создается связанный список, и новая запись (если она имеет другой ключ -> через метод equals()) помещается в начало связанного списка.В чем разница между сегментами ConcurrentHashMap и ведрами HashMap теоретически?

  1. Могу ли я соединить эту концепцию с концепцией ConcurrentHashMap, но вместо Buckets существуют сегменты, на которых отдельные потоки имеют блокировку. И вместо Записи есть HashEntry (ы). Аналогичным образом создается связанный список, и если вставленная пара ключа-значения отличается от основанного на equals() ключа, она помещается в конец связанного списка.
  2. Я правильно понимаю, что: Пометка CHM не синхронизирована, поэтому любой поток может получить доступ к этому методу, этот метод put вычисляет хеш-значение ключа, переданного ему, и получает индекс сегмента (Kinda like buckets). Затем только для этого сегмента он вызывает метод put. Теперь в разделе «Сегмент» метод put указывает, что будет lock(), так что только один поток может изменять данные в определенном сегменте, заключая таким образом, что если уровень параллелизма равен 16, должно быть 16 потоков, и, таким образом, эти потоки будут способный к PUT значения только по одному сегменту за раз.
+0

Это может помочь [Как работает ConcurrentHashMap внутри?] (Http://stackoverflow.com/questions/11793067/how-does-concurrenthashmap-work-internally) –

ответ

7
  1. ведро является индивидуальным слот массива карты. Это то же самое с обоими HashMap и ConcurrentHashMap. По идее, последний имеет свой массив, разбитый на сегменты (каждый сегмент представляет собой массив ссылок), но это все. Обратите внимание, что CHM в Java 8 больше не имеет сегментов, это всего лишь один массив.

  2. Да, это схема, известная как сегментированная блокировка. Это уменьшает конфликт между потоками, но не устраняет его.

+0

Для пт. 1 в вашем ответе: означает ли это, что ведра в CHM тоже разделены? А под этими сегментами есть связанные списки HashEntry? –

+0

Ковши нельзя разделить, они связаны списками. Сегмент - это массив ведра, на одном экземпляре карты их больше. –

+0

Но структура, как я видел в коде, как: CHM имеет экземпляр сегмента сегмента имеет экземпляр HashEntry Где ведро прийти в картину –