Я понимаю, что в HashMap записи (Key, Value) помещаются в ведра на основе хэша (Key.hashCode) -> Индекс, обозначающий местоположение ведра. В случае, если запись уже размещена в этом месте, создается связанный список, и новая запись (если она имеет другой ключ -> через метод equals()) помещается в начало связанного списка.В чем разница между сегментами ConcurrentHashMap и ведрами HashMap теоретически?
- Могу ли я соединить эту концепцию с концепцией ConcurrentHashMap, но вместо Buckets существуют сегменты, на которых отдельные потоки имеют блокировку. И вместо Записи есть HashEntry (ы). Аналогичным образом создается связанный список, и если вставленная пара ключа-значения отличается от основанного на equals() ключа, она помещается в конец связанного списка.
- Я правильно понимаю, что: Пометка CHM не синхронизирована, поэтому любой поток может получить доступ к этому методу, этот метод put вычисляет хеш-значение ключа, переданного ему, и получает индекс сегмента (Kinda like buckets). Затем только для этого сегмента он вызывает метод put. Теперь в разделе «Сегмент» метод put указывает, что будет lock(), так что только один поток может изменять данные в определенном сегменте, заключая таким образом, что если уровень параллелизма равен 16, должно быть 16 потоков, и, таким образом, эти потоки будут способный к PUT значения только по одному сегменту за раз.
Это может помочь [Как работает ConcurrentHashMap внутри?] (Http://stackoverflow.com/questions/11793067/how-does-concurrenthashmap-work-internally) –