Эволюция ConcurrentHashMap: углубленный анализ принципов реализации от Java 8 до Java 17
Эволюция ConcurrentHashMap: углубленный анализ принципов реализации от Java 8 до Java 17

1. Введение

на Одновременное программирование Яве,ConcurrentHashMapс его выдающимсяодновременнопроизводительностьи согласованность данных стали первым выбором многих разработчиков.。С Явы 5изпредставлено до сих пор,ConcurrentHashMapиспытал множество крупныхизулучшатьиоптимизация。В этой статье будет подробно и всесторонне рассмотрено С Явы До 8 на Яву 17серединаConcurrentHashMapизвыполнитьпринципи его изменения。

2. ConcurrentHashMap до Java 8

До Java 8 принцип реализации ConcurrentHashMap в основном основывался на механизме блокировки сегментации (Segmentation Lock). Такая конструкция позволяет ему обеспечивать хорошую производительность в средах с высоким уровнем параллелизма. Ниже приводится подробное введение:

1. Внутренняя структура и инициализация

ConcurrentHashMapИнтерьер в основном состоит из трех компонентов.:одинSegmentмножество、Хэш-функции и узлы «ключ-значение»。Чтосередина,Segmentдаодинреентерабельныйизблокировка мьютекса,каждыйSegmentСодержит хеш-таблицу,Каждый элемент хеш-таблицы представляет собой связанный список.

при инициализацииConcurrentHashMapчас,создастодинSegmentмножество,и указать начальную мощность и коэффициент загрузки。каждыйSegmentизначальная мощностьикоэффициент нагрузки по отношению ко всемуConcurrentHashMapизтакой же。также,Также сделаю это длякаждыйSegmentраспространятьодин Замок,используется для контроля надSegmentизодновременнодоступ。

2. Класс сегмента

Segmentкласс этоConcurrentHashMapвыполнитьодновременноконтрольизосновной。он наследует отReentrantLock,Иметь свой замок,и Содержит хеш-таблицу。Segmentдобрыйсерединаиз Структура хеш-таблицы и обычнаяизHashMapпохожий,Используйте связанные списки для разрешения конфликтов хэшей. Каждый узел связанного списка содержит пару ключ-значение и ссылку на следующий узел.

Помимо хеш-таблиц,SegmentТакже поддерживает некоторую статистическую информацию,Такие как количество элементов, количество модификаций и т. д. Эта информация используется для поддержки операций расширения и итератора.

3. Управление параллелизмом

когда Нужны темыдоступConcurrentHashMapсерединаизключчас,Сначала он вычислит хеш-значение ключа.,И согласно хеш-значениюиз Расположен высоковерноотвечатьизSegment。Затем,Поток попытается получитьSegmentиз Замок。Если блокировка уже удерживается другим потоком,Текущий поток будет ждать, пока не получит блокировку.

Как только поток получитSegmentиз Замок,Это может быть тамSegmentВнутренняя хэш-таблицаиз Находить、вставить илиудалитьдействовать。Этидействоватьс обычнымизHashMapпохожий,Но это нужно делать под защитой замка, чтобы обеспечить потокобезопасность. После завершения операции,Поток освободит блокировку,使得Что他线程有机会доступ ДолженSegment

Следует отметить, что,ХотякаждыйSegmentУ каждого есть свойиз Замок,Но весьConcurrentHashMapизодновременнопроизводительность并不完全取决于Замокизколичество。на самом деле,Такие факторы, как степень конкуренции за блокировки, распределение хэш-функции и коэффициент загрузки, будут влиять на одновременную производительность.

4. Расширение и перефразирование

когда кто-тоSegmentиз Коэффициент нагрузки превышает пороговое значениечас,Будут запущены операции по расширению. При расширении,создастодинновыйизSegmentмножество,и заменить оригиналSegmentсерединаизключевое значениеверно重новый散列到новыйизSegmentмножествосередина。Этот процесс включает в себя множествоиз Репликация данныхи Тяжелый расчет хеша。

Чтобы снизить влияние расширения на одновременнопроизводительность,ConcurrentHashMapПринято сегментированное расширениеиз Стратегия。Он обрабатывает толькоодинSegment,ИВ процессе расширения仍然允许Что他线程доступ Не обработаноизSegment。Это обеспечивает расширениедействоватьне заблокирует весьConcurrentHashMapизодновременнодоступ。

также,В процессе расширения,ConcurrentHashMapСуществует также метод под названием“трансферная стратегия”из技术来避免死Замокипроблема голода。Конкретно,когда кто-тонить позитивнаясуществоватьиметь дело содинSegmentчас,ЕслиSegmentНеобходимо расширение,Тогда операция расширения будет завершена другим потоком. Это гарантирует, что поток обработки не будет заблокирован слишком долго в ожидании расширения.

5. Резюме

Java 8ДоизConcurrentHashMap通过分段Замокиздизайнвыполнитьвысокийодновременнопроизводительность。Он делит хеш-таблицу на сегменты.,И используйте детальные блокировки для контроля доступа к каждому сегменту. Такая конструкция значительно снижает конфликты блокировок.,улучшенныйодновременнопроизводительность。Однако,С итерацией Java-версии и улучшением производительности оборудования.,Конструкция сегментных замков постепенно выявила некоторые проблемы.,Например, большое использование памяти, сложные операции расширения и т. д.

3. ConcurrentHashMap в Java 8

на Яве 8середина,ConcurrentHashMapизвыполнитьпринциппроизошло значительноизизменять,Он отказывается от механизма блокировки сегментации в предыдущих версиях.,Вместо этого была принята более эффективная и гибкая стратегия одновременного контроля.,Прямо сейчасОперация CAS (сравнение и замена) в сочетании с блоком синхронизации。这种новыйиздизайн不仅简化了структура данных,Это также повышает производительность в многоядерных процессорных средах.

1. Структура данных

Java 8серединаизConcurrentHashMapБазовая структура данных в основном состоит измножество、Состоит из связанного списка и красно-черного дерева.。множество用于存储ключевое значениеверноизузел,Каждый узел представляет собой либо связанный список,Либо красно-черное дерево. Когда длина связанного списка превышает определенный порог (по умолчанию — 8).,Связанный список будет преобразован в красно-черное дерево.,для повышения эффективности поиска.

2. Управление параллелизмом
2.1. Работа КАС.

CAS (Compare-and-Swap) — алгоритм без блокировок.,Он содержит три операнда — ячейку памяти (V), ожидаемое исходное значение (A) и новое значение (B). Если значение ячейки памяти V соответствует ожидаемому исходному значению A,Затем процессор автоматически обновит значение этой позиции до нового значения B. в противном случае,Процессор ничего не делает. независимо от ситуации,оно будет тамCAS指令До返回Должен位置изценить。существоватьConcurrentHashMapсередина,Операция CAS широко используется в таких сценариях, как добавление, удаление и обновление узлов.,Для обеспечения безопасности одновременных модификаций.

2.2. синхронизированный синхронизированный блок

Хотя операции CAS могут в значительной степени уменьшить конфликты блокировок, в некоторых случаях все же требуется более строгий механизм синхронизации для обеспечения корректности параллельных операций. Поэтому Ява 8серединаизConcurrentHashMapсуществоватьнуждатьсячасбуду использоватьсинхронизированный синхронизированный блок для защиты определенных сегментов кода клавиш, таких как операции с деревом, расширение и т. д. По сравнению с сегментными замками синхронизированный синхронизированный Block имеет меньшие накладные расходы и большую гибкость.

3. Вычисление и позиционирование хеша

Как и в предыдущих версиях, Java 8серединаизConcurrentHashMapТакже использует хэш-алгоритм для вычисления ключей.из哈希ценить,И найдите позицию индекса в массиве на основе значения хеш-функции. Разница в том,,Java Процесс вычисления хеша в версии 8 более сложен и усовершенствован, чтобы уменьшить коллизии хэшей и улучшить использование пространства. Кроме того, когда происходит коллизия хэшей, новые пары ключ-значение добавляются в конец связанного списка или красно-черного дерева вместо использования интерполяции головы, как в предыдущих версиях.

4. Расширение и перефразирование

когдаConcurrentHashMapсерединаиз元素количество超过множествоиз容量阈ценитьчас,вызовет расширениедействовать。В процессе расширения,создаст новый массив,И перефразируйте пары ключ-значение из исходного массива в новый массив. Отличие от предыдущей версии,Java Операция расширения в версии 8 больше не требует блокировки всего массива, а использует более детальную стратегию управления параллелизмом. В частности, он делит массив на несколько сегментов (каждый сегмент содержит несколько сегментов) и позволяет нескольким потокам одновременно обрабатывать разные сегменты. Такая конструкция может снизить конкуренцию блокировок и повысить производительность одновременного выполнения операций расширения.

5. Резюме

Java 8серединаизConcurrentHashMapприняв Операция CASобъединитьсинхронизированный синхронизированный блокизодновременноконтроль Стратегия以及оптимизация后изструктура данныхи Алгоритм хеширования и другие технические средствавыполнитьвысокийодновременнопроизводительность Внизиз Безопасность резьбыдоступ。与Доизверсия по сравнению,этосуществовать简化структура данных、Улучшение использования пространстваи降低Замок竞争等方面取得了显著изпрогресс。Эти улучшения позволяютConcurrentHashMapстановитьсяJavaодновременно Программированиенезаменимыйиз Одна из важных составляющих。

4. ConcurrentHashMap в Java 17

на Яве 17середина,ConcurrentHashMapизвыполнитьпринцип В основном поддерживаетсяJava 8, но может включать некоторые оптимизации и улучшения для адаптации к новым версиям JDK и аппаратным средам. Ниже приведена Java 17серединаConcurrentHashMapвыполнитьпринципизуглубленное введение:

1. Структура данных

с Java 8 Аналогично Java 17серединаизConcurrentHashMapТакже используетсямножество、Связанные списки и красно-черные деревья как базовые структуры данных.。множество用于存储ключевое значениеверноизузел,Каждый узел формирует связанный список при возникновении конфликта хэшей.,Когда длина связанного списка превышает определенный порог (по умолчанию — 8), а длина массива превышает 64.,Связанный список будет преобразован в красно-черное дерево.,для повышения эффективности поиска. Если длина массива меньше или равна 64,не будет деревом,Вместо этого расширение используется для уменьшения конфликтов хеширования.

2. Управление параллелизмом

Java 17серединаизConcurrentHashMapВсе еще использую Операция CASисинхронизированный синхронизированный блокировать программу одновременно Операция. CAS используется для операций добавления, удаления и обновления узлов без блокировки, а синхронизированный синхронизированный блок используется для защиты сегментов кода, требующих более строгой синхронизации, например формирования и расширения дерева.

но,на Яве В версии 17 JDK, возможно, дополнительно оптимизировал эти операции, чтобы уменьшить количество ненужных операций CAS, заблокировать конкуренцию и повысить производительность параллелизма. Например, можно управлять объемом синхронизированных синхронизированных блоков с более высокой степенью детализации или использовать более эффективные реализации блокировок и т. д.

3. Вычисление и позиционирование хеша

Java 17серединаизConcurrentHashMapПроцесс расчета хешас Java 8 аналогична, но может включать некоторые оптимизации для новых аппаратных сред. Значение хеш-функции используется для определения позиции индекса в массиве. При возникновении конфликта хеш-функции в конец связанного списка или красно-черного дерева добавляется новая пара ключ-значение.

Кроме того, Ява 17серединаизConcurrentHashMap可能还引入了一些новыйиз哈希算法或哈希冲突解决Стратегия,Для дальнейшего уменьшения коллизий хэшей и улучшения использования пространства.

4. Расширение и перефразирование

когдаConcurrentHashMapсерединаиз元素количество超过множествоиз容量阈ценитьчас,Вызовет расширениедействовать。на Яве 17, основные принципы операции расширения Java 8 аналогичен: создается новый массив и перехэшируются пары ключ-значение из исходного массива в новый массив. Однако Ява 17 Возможно, были оптимизированы и улучшены такие аспекты, как управление параллелизмом и миграция данных в процессе расширения.

Например, уменьшить конкуренцию блокировок за счет более детальных стратегий управления параллелизмом; использовать более эффективные алгоритмы миграции данных для снижения затрат на производительность во время расширения или внедрить некоторые новые технические средства для повышения производительности параллелизма и надежности операций расширения и т. д.

5. Другие улучшения и оптимизации.

В дополнение к вышеуказанным основным принципам Java 17серединаизConcurrentHashMap还包含一些Что他улучшатьиоптимизация:

  • Лучшее расположение памяти и использование кэша:通过оптимизацияструктура данныхизрасположение памятиидоступмодель,Улучшите использование кэша и уменьшите затраты на доступ к памяти.
  • Более эффективная работа узлов:通过оптимизацияузелиздобавить в、удалитьи更новый等действовать,Уменьшите ненужное выделение памяти и накладные расходы на сбор мусора.
  • Более гибкая настройка параметров:Предложите большеиз Возможности конфигурации параметров,Это позволяет пользователям выполнять более детальную настройку производительности на основе конкретных сценариев применения.
  • Улучшенный механизм обработки ошибок и исключений.:增强错误иметь дело си异常иметь дело с能力,Повышение устойчивости и надежности программы.

Короче говоря, на Яве 17середина,ConcurrentHashMap仍然даодинвысокийпроизводительность、Потокобезопасная реализация одновременно хэш-таблицы, которая находится в структуре данных、одновременноконтроль、Вычисление и позиционирование хеша, а также расширение и повторное хеширование были тщательно разработаны и оптимизированы.

5. Резюме

С Явы До 8 на Яву 17,ConcurrentHashMapиспытал значительныеиз Эволюция。Java Версии до 8 используют механизм блокировки сегментации для обеспечения управления параллелизмом Java; В версии 8 представлены красно-черные деревья и более детальные стратегии блокировки для оптимизации производительности при работе с Java; 17. Сохраняйте Java 8基本дизайнизтакой жечас,верноодновременноконтрольивнутреннийвыполнитьпонесено дальшеизоптимизацияиулучшать。Эти изменения делаютConcurrentHashMapсуществоватьодновременнопроизводительность、накладные расходы на памятьи Стабильность и другие аспекты постоянно улучшаются.и Полный。какJavaодновременно Программированиеизважные компоненты,ConcurrentHashMapиз Эволюция历程反映了Javaплатформаверноодновременнопроизводительностьистабильностьиз Непрерывное преследованиеипродвигать。существоватьбудущееизJavaВерсиясередина,Мы можем ожидать новых оптимизаций и улучшений.,Для удовлетворения растущего спроса на одновременное программирование.



Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт код тридцать пять , для получения дополнительной технической информации.


boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose