|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
|||||||||||
Как устроена ConcurrentHashMap ?26.05.2014, 17:41. Показов 6690. Ответов 20
Метки нет (Все метки)
Почитал про ConcurrentHashMap. Честно говоря куча вопросов.
значащие поля:
Ну и наверное самый первый и важный вопрос - что вообще эта коллекция нам даёт то ? В HasMap в такой-то ситуации была проблема - в Concurrent реализации ее нет. Добавлено через 1 час 4 минуты Зачем нужны сегменты ? (знаю, что порой блокировка происходит посегментно) По какому принципу попадают в сегменты?
0
|
|||||||||||
| 26.05.2014, 17:41 | |
|
Ответы с готовыми решениями:
20
Как устроена рекурсия? |
|
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
| 26.05.2014, 18:29 | |
|
Ответ в названии. ConcurrentHashMap поддерживает многопоточность. Отсюда и реализация. Вы можете вставить несколько элементов одновременно т.к есть сегменты.
0
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
||
| 26.05.2014, 19:21 [ТС] | ||
|
KEKCoGEN, я хотел мягко говоря более подробного ответа)
И наверное даже догадываюсь кто его сможет дать)) Добавлено через 45 минут
0
|
||
|
|
|
| 26.05.2014, 20:20 | |
|
На хабре есть небольшое описание CHMv7 - http://habrahabr.ru/post/132884/
В исходниках самого CHM можно найти небольшое описание алгоритма и принципа работы. Для CHMv8 и для CHMv7 Что касается назначения: это thread-safe универсальная мапа, скорость работы которой масштабируется на множестве потоков.
0
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
||||||
| 26.05.2014, 21:49 [ТС] | ||||||
|
turbanoff, Хабр уже читал, но там очень скупо написано.
попробую почитать исходники. [QUOTE turbanoff]Что касается назначения: это thread-safe универсальная мапа, скорость работы которой масштабируется на множестве потоков.[/QUOTE] Ну это да, я понял) Типо если мы просто обернем все методы syncronized, то блочим всю мапу, а тут как-то по сегментам. Но как-то такое описание меня не удовлетворяет). В общем пока почитаю исходники) Добавлено через 1 час 4 минуты turbanoff, Почитал, что пишут в доке. Узнал, что эти сегменты "грузятся" по необходимости... какого-то целостного представления так и нет(.
0
|
||||||
|
|
|
| 26.05.2014, 22:29 | |
|
Ну разумеется, Segment это не наследник HashMap, он просто устроен аналогичным образом.
Аналогичная таблица бакетов и поля threshold, modCount, loadFactor. А наследником ReentrantLock-а его сделали, чтобы сэкономить на одном поле, и немного упростить код.
0
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
||
| 26.05.2014, 23:18 [ТС] | ||
|
а не подскажете ссылки на буржуйском хотя бы где разжёвано как это всё работает, а то по исходникам мне как-то совсем тяжело, а те ссылки, что были упомянуты не открыли мне глаза на правду. Я просто сам по себе знаю, что если ты знаешь истину, то тебе проще отличить плохую статью от хорошей.
0
|
||
|
|
|
| 26.05.2014, 23:57 | |
|
Что-то не гуглится ничего стоящего. Вот тут есть схемы, возможно с ними станет понятнее - http://javaopensourcecode.blog... shmap.html
Если читать исходники CHM, то лучше взять из java 5 - там попроще и покороче. Посмотреть можно тут
1
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
|
| 27.05.2014, 00:08 [ТС] | |
|
turbanoff, спасибо, почитаю как руки дойдут.
0
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
|
| 27.05.2014, 18:09 [ТС] | |
|
Давайте порисуем)
вот наша до боли знакомая хэшмапа: квадратики - бакеты кружки объекты, которые разложены по бакетам. сегмент это набор бакетов ?
0
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
||
| 27.05.2014, 18:35 [ТС] | ||
|
ну то есть давайте от структуры данных плясать. в коде мы можем иметь указатели на всё что угодно в любых количествах, но думаю не будет проблем с пониманием, если нарисовать.
Добавлено через 12 минут Как определяется позиция для вставки: считаем hascode первые 4 символа определяют сегмент. получается, что мы ограничены 9999 сегментами ? остальные - определяют бакет. Значит имеем, что сегменты и бакеты - жестко связаны. Если попал в сегмент1, то попадёшь в один из бакетов, который к нему относится. а может ли быть так, что бакеты пересекаются между сегментами. ну то есть может ли бакет быть вхож в 2 сегмента сразу? Добавлено через 6 минут
0
|
||
|
|
|||
| 27.05.2014, 22:11 | |||
|
Если вы делаете ноды неизменямыми, то получается что этот указатель нельзя поменять после создания ноды. При удалении элемента из списка вам нужно поменять указатель в предыдущем элементе, но вы не можете его менять - и поэтому приходится создавать новую ноду. Так вы создали новую ноду, то в указатель, записанный в предыдущем от предыдущего, перестал был правильным - вам надо будет и его пересоздавать. То есть при удалении приходится пересоздавать все ноды в списке, до текущего. Все последующие можно оставить так как есть, в них ничего менять не нужно.
0
|
|||
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
|
| 28.05.2014, 02:26 [ТС] | |
|
0
|
|
|
|
|
| 28.05.2014, 02:38 | |
|
нет. Нода, это не бакет.
Сегмент состоит из массива бакетов. В бакет попадают элементы, у которых hashCode одинаковые (или почти одинаковые). Чтобы хранить такие элементы отдельный бакет представляет из себя односвязный список. Элемент этого списка - это и есть нода (HashEnty). Сегмент - практически полный аналог обычной HashMap. Возможно стоит повторить её устройство.
1
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
|
| 28.05.2014, 10:17 [ТС] | |
|
turbanoff, ааааа всё понял) просто иногда терминология путает)
Но пересоздавание списка нод ведь нужно только при удалении ? я думал, что новая нода всегда добавляется в конец, а получается, что скорее всего в начало списка для улучшения производительности? А сегменты всегда имеют одинаковое количество бакетов или это как-то балансируется в зависимости от нагрузки?
0
|
|
|
|
|||||||||
| 28.05.2014, 17:24 | |||||||||
0
|
|||||||||
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
||||
| 28.05.2014, 18:18 [ТС] | ||||
|
0
|
||||
|
|
|
| 28.05.2014, 19:52 | |
|
HashEntry<K,V>[] table - это массив односвязных списков.
Чтобы хранить ссылку на односвязный список нужно всего лишь хранить ссылку на его первый элемент. Вот в массиве и хранятся ссылки на первые элементы списков. Каждый такой список я и называю бакетом.
0
|
|
|
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
|
||
| 29.05.2014, 00:06 [ТС] | ||
Я так понимаю, что в этом случае перефигачивается(пересчитываются места куда кладутся элементы) весь сегмент(всё таки наверное не мапа)
0
|
||
|
|
|
| 29.05.2014, 14:55 | |
Сообщение было отмечено gredwhite как решение
Решение
gredwhite, Да, всё верно.
1
|
|
| 29.05.2014, 14:55 | |
|
Помогаю со студенческими работами здесь
20
Как устроена графика? Как устроена корзина? Как устроена плавающая запятая? Как устроена задержка в TTimer? Как устроена функция rand() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|