на Одновременное программирование Яве,ConcurrentHashMap
с его выдающимсяодновременнопроизводительностьи согласованность данных стали первым выбором многих разработчиков.。С Явы 5изпредставлено до сих пор,ConcurrentHashMap
испытал множество крупныхизулучшатьиоптимизация。В этой статье будет подробно и всесторонне рассмотрено С Явы До 8 на Яву 17серединаConcurrentHashMap
извыполнитьпринципи его изменения。
До Java 8 принцип реализации ConcurrentHashMap в основном основывался на механизме блокировки сегментации (Segmentation Lock). Такая конструкция позволяет ему обеспечивать хорошую производительность в средах с высоким уровнем параллелизма. Ниже приводится подробное введение:
ConcurrentHashMap
Интерьер в основном состоит из трех компонентов.:одинSegment
множество、Хэш-функции и узлы «ключ-значение»。Чтосередина,Segment
даодинреентерабельныйизблокировка мьютекса,каждыйSegment
Содержит хеш-таблицу,Каждый элемент хеш-таблицы представляет собой связанный список.
при инициализацииConcurrentHashMap
час,создастодинSegment
множество,и указать начальную мощность и коэффициент загрузки。каждыйSegment
изначальная мощностьикоэффициент нагрузки по отношению ко всемуConcurrentHashMap
изтакой же。также,Также сделаю это длякаждыйSegment
распространятьодин Замок,используется для контроля надSegment
изодновременнодоступ。
Segment
класс этоConcurrentHashMap
выполнитьодновременноконтрольизосновной。он наследует отReentrantLock
,Иметь свой замок,и Содержит хеш-таблицу。Segment
добрыйсерединаиз Структура хеш-таблицы и обычнаяизHashMap
похожий,Используйте связанные списки для разрешения конфликтов хэшей. Каждый узел связанного списка содержит пару ключ-значение и ссылку на следующий узел.
Помимо хеш-таблиц,Segment
Также поддерживает некоторую статистическую информацию,Такие как количество элементов, количество модификаций и т. д. Эта информация используется для поддержки операций расширения и итератора.
когда Нужны темыдоступConcurrentHashMap
серединаизключчас,Сначала он вычислит хеш-значение ключа.,И согласно хеш-значениюиз Расположен высоковерноотвечатьизSegment
。Затем,Поток попытается получитьSegment
из Замок。Если блокировка уже удерживается другим потоком,Текущий поток будет ждать, пока не получит блокировку.
Как только поток получитSegment
из Замок,Это может быть тамSegment
Внутренняя хэш-таблицаиз Находить、вставить илиудалитьдействовать。Этидействоватьс обычнымизHashMap
похожий,Но это нужно делать под защитой замка, чтобы обеспечить потокобезопасность. После завершения операции,Поток освободит блокировку,使得Что他线程有机会доступ ДолженSegment
。
Следует отметить, что,ХотякаждыйSegment
У каждого есть свойиз Замок,Но весьConcurrentHashMap
изодновременнопроизводительность并不完全取决于Замокизколичество。на самом деле,Такие факторы, как степень конкуренции за блокировки, распределение хэш-функции и коэффициент загрузки, будут влиять на одновременную производительность.
когда кто-тоSegment
из Коэффициент нагрузки превышает пороговое значениечас,Будут запущены операции по расширению. При расширении,создастодинновыйизSegment
множество,и заменить оригиналSegment
серединаизключевое значениеверно重новый散列到новыйизSegment
множествосередина。Этот процесс включает в себя множествоиз Репликация данныхи Тяжелый расчет хеша。
Чтобы снизить влияние расширения на одновременнопроизводительность,ConcurrentHashMap
Принято сегментированное расширениеиз Стратегия。Он обрабатывает толькоодинSegment
,ИВ процессе расширения仍然允许Что他线程доступ Не обработаноизSegment
。Это обеспечивает расширениедействоватьне заблокирует весьConcurrentHashMap
изодновременнодоступ。
также,В процессе расширения,ConcurrentHashMap
Существует также метод под названием“трансферная стратегия”из技术来避免死Замокипроблема голода。Конкретно,когда кто-тонить позитивнаясуществоватьиметь дело содинSegment
час,ЕслиSegment
Необходимо расширение,Тогда операция расширения будет завершена другим потоком. Это гарантирует, что поток обработки не будет заблокирован слишком долго в ожидании расширения.
Java 8ДоизConcurrentHashMap
通过分段Замокиздизайнвыполнитьвысокийодновременнопроизводительность。Он делит хеш-таблицу на сегменты.,И используйте детальные блокировки для контроля доступа к каждому сегменту. Такая конструкция значительно снижает конфликты блокировок.,улучшенныйодновременнопроизводительность。Однако,С итерацией Java-версии и улучшением производительности оборудования.,Конструкция сегментных замков постепенно выявила некоторые проблемы.,Например, большое использование памяти, сложные операции расширения и т. д.
на Яве 8середина,ConcurrentHashMap
извыполнитьпринциппроизошло значительноизизменять,Он отказывается от механизма блокировки сегментации в предыдущих версиях.,Вместо этого была принята более эффективная и гибкая стратегия одновременного контроля.,Прямо сейчасОперация CAS (сравнение и замена) в сочетании с блоком синхронизации。这种новыйиздизайн不仅简化了структура данных,Это также повышает производительность в многоядерных процессорных средах.
Java 8серединаизConcurrentHashMap
Базовая структура данных в основном состоит измножество、Состоит из связанного списка и красно-черного дерева.。множество用于存储ключевое значениеверноизузел,Каждый узел представляет собой либо связанный список,Либо красно-черное дерево. Когда длина связанного списка превышает определенный порог (по умолчанию — 8).,Связанный список будет преобразован в красно-черное дерево.,для повышения эффективности поиска.
CAS (Compare-and-Swap) — алгоритм без блокировок.,Он содержит три операнда — ячейку памяти (V), ожидаемое исходное значение (A) и новое значение (B). Если значение ячейки памяти V соответствует ожидаемому исходному значению A,Затем процессор автоматически обновит значение этой позиции до нового значения B. в противном случае,Процессор ничего не делает. независимо от ситуации,оно будет тамCAS指令До返回Должен位置изценить。существоватьConcurrentHashMap
середина,Операция CAS широко используется в таких сценариях, как добавление, удаление и обновление узлов.,Для обеспечения безопасности одновременных модификаций.
Хотя операции CAS могут в значительной степени уменьшить конфликты блокировок, в некоторых случаях все же требуется более строгий механизм синхронизации для обеспечения корректности параллельных операций. Поэтому Ява 8серединаизConcurrentHashMap
существоватьнуждатьсячасбуду использоватьсинхронизированный синхронизированный блок для защиты определенных сегментов кода клавиш, таких как операции с деревом, расширение и т. д. По сравнению с сегментными замками синхронизированный синхронизированный Block имеет меньшие накладные расходы и большую гибкость.
Как и в предыдущих версиях, Java 8серединаизConcurrentHashMap
Также использует хэш-алгоритм для вычисления ключей.из哈希ценить,И найдите позицию индекса в массиве на основе значения хеш-функции. Разница в том,,Java Процесс вычисления хеша в версии 8 более сложен и усовершенствован, чтобы уменьшить коллизии хэшей и улучшить использование пространства. Кроме того, когда происходит коллизия хэшей, новые пары ключ-значение добавляются в конец связанного списка или красно-черного дерева вместо использования интерполяции головы, как в предыдущих версиях.
когдаConcurrentHashMap
серединаиз元素количество超过множествоиз容量阈ценитьчас,вызовет расширениедействовать。В процессе расширения,создаст новый массив,И перефразируйте пары ключ-значение из исходного массива в новый массив. Отличие от предыдущей версии,Java Операция расширения в версии 8 больше не требует блокировки всего массива, а использует более детальную стратегию управления параллелизмом. В частности, он делит массив на несколько сегментов (каждый сегмент содержит несколько сегментов) и позволяет нескольким потокам одновременно обрабатывать разные сегменты. Такая конструкция может снизить конкуренцию блокировок и повысить производительность одновременного выполнения операций расширения.
Java 8серединаизConcurrentHashMap
приняв Операция CASобъединитьсинхронизированный синхронизированный блокизодновременноконтроль Стратегия以及оптимизация后изструктура данныхи Алгоритм хеширования и другие технические средствавыполнитьвысокийодновременнопроизводительность Внизиз Безопасность резьбыдоступ。与Доизверсия по сравнению,этосуществовать简化структура данных、Улучшение использования пространстваи降低Замок竞争等方面取得了显著изпрогресс。Эти улучшения позволяютConcurrentHashMap
становитьсяJavaодновременно Программированиенезаменимыйиз Одна из важных составляющих。
на Яве 17середина,ConcurrentHashMap
извыполнитьпринцип В основном поддерживаетсяJava 8, но может включать некоторые оптимизации и улучшения для адаптации к новым версиям JDK и аппаратным средам. Ниже приведена Java 17серединаConcurrentHashMap
выполнитьпринципизуглубленное введение:
с Java 8 Аналогично Java 17серединаизConcurrentHashMap
Также используетсямножество、Связанные списки и красно-черные деревья как базовые структуры данных.。множество用于存储ключевое значениеверноизузел,Каждый узел формирует связанный список при возникновении конфликта хэшей.,Когда длина связанного списка превышает определенный порог (по умолчанию — 8), а длина массива превышает 64.,Связанный список будет преобразован в красно-черное дерево.,для повышения эффективности поиска. Если длина массива меньше или равна 64,не будет деревом,Вместо этого расширение используется для уменьшения конфликтов хеширования.
Java 17серединаизConcurrentHashMap
Все еще использую Операция CASисинхронизированный синхронизированный блокировать программу одновременно Операция. CAS используется для операций добавления, удаления и обновления узлов без блокировки, а синхронизированный синхронизированный блок используется для защиты сегментов кода, требующих более строгой синхронизации, например формирования и расширения дерева.
но,на Яве В версии 17 JDK, возможно, дополнительно оптимизировал эти операции, чтобы уменьшить количество ненужных операций CAS, заблокировать конкуренцию и повысить производительность параллелизма. Например, можно управлять объемом синхронизированных синхронизированных блоков с более высокой степенью детализации или использовать более эффективные реализации блокировок и т. д.
Java 17серединаизConcurrentHashMap
Процесс расчета хешас Java 8 аналогична, но может включать некоторые оптимизации для новых аппаратных сред. Значение хеш-функции используется для определения позиции индекса в массиве. При возникновении конфликта хеш-функции в конец связанного списка или красно-черного дерева добавляется новая пара ключ-значение.
Кроме того, Ява 17серединаизConcurrentHashMap
可能还引入了一些новыйиз哈希算法或哈希冲突解决Стратегия,Для дальнейшего уменьшения коллизий хэшей и улучшения использования пространства.
когдаConcurrentHashMap
серединаиз元素количество超过множествоиз容量阈ценитьчас,Вызовет расширениедействовать。на Яве 17, основные принципы операции расширения Java 8 аналогичен: создается новый массив и перехэшируются пары ключ-значение из исходного массива в новый массив. Однако Ява 17 Возможно, были оптимизированы и улучшены такие аспекты, как управление параллелизмом и миграция данных в процессе расширения.
Например, уменьшить конкуренцию блокировок за счет более детальных стратегий управления параллелизмом; использовать более эффективные алгоритмы миграции данных для снижения затрат на производительность во время расширения или внедрить некоторые новые технические средства для повышения производительности параллелизма и надежности операций расширения и т. д.
В дополнение к вышеуказанным основным принципам Java 17серединаизConcurrentHashMap
还包含一些Что他улучшатьиоптимизация:
Короче говоря, на Яве 17середина,ConcurrentHashMap
仍然даодинвысокийпроизводительность、Потокобезопасная реализация одновременно хэш-таблицы, которая находится в структуре данных、одновременноконтроль、Вычисление и позиционирование хеша, а также расширение и повторное хеширование были тщательно разработаны и оптимизированы.
С Явы До 8 на Яву 17,ConcurrentHashMap
испытал значительныеиз Эволюция。Java Версии до 8 используют механизм блокировки сегментации для обеспечения управления параллелизмом Java; В версии 8 представлены красно-черные деревья и более детальные стратегии блокировки для оптимизации производительности при работе с Java; 17. Сохраняйте Java 8基本дизайнизтакой жечас,верноодновременноконтрольивнутреннийвыполнитьпонесено дальшеизоптимизацияиулучшать。Эти изменения делаютConcurrentHashMap
существоватьодновременнопроизводительность、накладные расходы на памятьи Стабильность и другие аспекты постоянно улучшаются.и Полный。какJavaодновременно Программированиеизважные компоненты,ConcurrentHashMap
из Эволюция历程反映了Javaплатформаверноодновременнопроизводительностьистабильностьиз Непрерывное преследованиеипродвигать。существоватьбудущееизJavaВерсиясередина,Мы можем ожидать новых оптимизаций и улучшений.,Для удовлетворения растущего спроса на одновременное программирование.
Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт 『
код тридцать пять
』 , для получения дополнительной технической информации.