ConcurrentHashMap 存储结构源码解析

下面我会详细讲解“ConcurrentHashMap 存储结构源码解析”的完整攻略。

ConcurrentHashMap 存储结构源码解析

一、ConcurrentHashMap 的概述

ConcurrentHashMap 是 JDK 中一个并发访问的哈希表,它提供了线程安全的哈希表访问功能,适用于高并发场景。ConcurrentHashMap 基于分段锁(Segment)实现并发访问。在 JDK1.7 中,ConcurrentHashMap 使用分段锁的机制来控制对不同 Segment 的访问,在 JDK1.8 中采用了更加优秀的 CAS+Synchronized 实现方式,以提高并发的性能。

二、ConcurrentHashMap 的内部结构

1. ConcurrentHashMap 存储结构

ConcurrentHashMap 的存储结构是一个数组和若干个 Segment。其中,数组是 ConcurrentHashMap 的主体,而 Segment 则是对数组中每个元素(也就是每一个 hash 桶)进行加锁,实现并发控制的机制。

因此,ConcurrentHashMap 的存储结构可以形象地描述为:一个数组 + 多个锁。

2. Segment 存储结构

在 JDK1.7 中,ConcurrentHashMap 使用分段锁的机制来实现多线程并发访问是,每个 Segment 维护着一个 HashEntry 数组,每一个 HashEntry 对象就是一个映射的键值对,其中键值对主要包括三个属性:Key、Value 和 next。

在 JDK1.8 中,ConcurrentHashMap 引入了 CAS+Synchronized 的机制,废除了 Segment,所以其存储结构也相应的被修改了。在 JDK1.8 的 ConcurrentHashMap 中,数组的每个元素不再是一个链表,而是一个数据集合,这个数据集合是一个桶,里面存储了多个映射的键值对,称之为 Node,其中 Node 存储了四个属性:hash、key、value 和 next。

3. ConcurrentHashMap 存储结构示例

下面对 ConcurrentHashMap 的存储结构进行示例说明。假设桶的数量为 16,其中每个桶使用链表来存储多个映射的键值对。在 JDK1.7 中,ConcurrentHashMap 的存储结构如下:

ConcurrentHashMap
+- Segment
|  +- HashEntry 0
|  +- HashEntry 1
|  +- ...
|  +- HashEntry N
+- Segment
|  +- HashEntry 0
|  +- HashEntry 1
|  +- ...
|  +- HashEntry N
+- ...

在 JDK1.8 中,ConcurrentHashMap 的存储结构如下:

ConcurrentHashMap
+- Node 0
|  +- Node 1.1
|  +- Node 1.2
|  +- ...
|  +- Node 1.N
+- Node 1
|  +- Node 2.1
|  +- Node 2.2
|  +- ...
|  +- Node 2.N
+- ...

三、ConcurrentHashMap 的线程安全实现

ConcurrentHashMap 的线程安全实现主要是通过加锁和同步机制来实现的。

1. JDK1.7 中 ConcurrentHashMap 的线程安全实现

在 JDK1.7 中,ConcurrentHashMap 使用分段锁的机制来实现对不同哈希桶的访问的并发控制。ConcurrentHashMap 中维护了一个名为 segments 的数组,每个元素为一个 Segment 对象,每个 Segment 维护着一个 HashEntry 数组,每一个 HashEntry 对象就是一个映射的键值对,其中键值对主要包括三个属性:Key、Value 和 next。

在 JDK1.7 中,ConcurrentHashMap 访问哈希表时,首先根据 Key 计算出其 hash 值,然后根据 hash 值求取其对应的 Segment 对象,最后进一步获取 Key 对应的 HashEntry,进行添加、删除和查询等操作。

在并发控制方面,JDK1.7 的 ConcurrentHashMap 维护了一个名为 "segments" 的数组,每个元素都是一个 Segment 对象,每个 Segment 对象实现了自己的加锁和解锁操作。并发访问时,每个线程会联系一个 ThreadLocal 变量,从而获取一个独立的 HashEntry。这样做可以避免不必要的竞争,提高并发效率。

2. JDK1.8 中 ConcurrentHashMap 的线程安全实现

在 JDK1.8 中,ConcurrentHashMap 引入了 CAS+Synchronized 机制,废除了 Segment,所以其线程安全实现也相应的被修改了。

在 JDK1.8 的 ConcurrentHashMap 中,数组的每个元素不再是一个链表,而是一个数据集合,这个数据集合是一个桶,里面存储了多个映射的键值对,称之为 Node,其中 Node 存储了四个属性:hash、key、value 和 next。多个线程可以同时访问同一个桶,但是对同一个 Node 的访问是需要同步的。

在并发控制方面,JDK1.8 中 ConcurrentHashMap 采用 CAS+Synchronized 机制来控制对同一个桶(即数组的一个元素)的访问。具体来说,在添加节点时,首先在对应的节点位置失败的尝试使用 CAS 添加,如果尝试失败,则采用 Synchronized 机制。

结尾

以上就是对 ConcurrentHashMap 存储结构源码解析的完整攻略,内容包括了 ConcurrentHashMap 的概述、内部结构、线程安全实现等方面,其中还包含了 JDK1.7 和 JDK1.8 两个版本的实现示例,希望对读者有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ConcurrentHashMap 存储结构源码解析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vue开发项目详细教程(第一篇搭建环境篇)

    Vue开发项目详细教程(第一篇搭建环境篇) Vue是一款非常流行的前端框架,能够帮助开发者快速构建响应式、高效、灵活的Web应用程序。本文将为大家介绍如何搭建Vue开发环境,为后续的Vue项目开发做好准备。 1. 安装Node.js 在开始搭建Vue开发环境之前,需要先安装Node.js。Node.js是基于Chrome V8引擎的JavaScript运行环…

    其他 2023年3月28日
    00
  • qt|菜鸟起飞简单教程

    Qt|菜鸟起飞简单教程 Qt是一个跨平台的C++应用程序开发框架,它可以用于开发桌面应用程序、移动应程序和嵌入式应用程序等。本教程介绍如何使用Qt开发应用程序,包括以下内容: 下载和安装Qt 创建Qt项目 编写Qt代码 编译和运行Qt项目 示例说明 1. 下载和安装Qt 首先,我们需要从Qt官网下载Qt的安装程序。下载完成双击安装程序按照提示安装。 2. 创…

    other 2023年5月7日
    00
  • Python中使用Selenium环境安装的方法步骤

    请看下面的攻略: Python中使用Selenium环境安装的方法步骤 简介 Selenium是一个自动化测试工具,可以用于高效地进行网站测试,模拟用户操作等。在Python中使用Selenium能够极大地降低开发成本,提高开发效率,因此在Web开发中被广泛使用。 安装步骤 1. 安装Python 在使用Selenium之前,你需要先安装Python,可以在…

    other 2023年6月27日
    00
  • php使用cookie保存用户登录的用户名实例

    下面我将详细讲解“php使用cookie保存用户登录的用户名实例”的完整攻略。 一、什么是cookie Cookie 是存储在客户端计算机上的小文本文件。它们被用于在浏览器上存储数据,例如用户首选项、购物车内容或使用者的身份信息等等。 二、什么时候使用cookie Cookie 可以在网站需要保存用户数据时使用。例如,当用户登录网站时,可以使用 Cookie…

    other 2023年6月27日
    00
  • 公众号自定义菜单设置 公众号子菜单下怎么设置文章目录

    下面是“公众号自定义菜单设置 公众号子菜单下怎么设置文章目录”的完整攻略。 1. 什么是公众号自定义菜单? 公众号自定义菜单是指公众号主可以根据自己的需求,将常用的功能按钮制作成菜单,让用户更方便地使用公众号的服务和功能。 2. 如何设置公众号自定义菜单? 第一步:登录微信公众平台,进入“自定义菜单”页面。 第二步:点击“创建菜单”,然后根据需要设置菜单名称…

    other 2023年6月25日
    00
  • 小记一次mysql主从配置解决方案

    小记一次MySQL主从配置解决方案 MySQL主从复制是提高MySQL数据库高可用性、负载均衡和数据备份的关键技术之一。下面是一份完整的攻略,介绍了如何在两台MySQL服务器之间进行主从复制及配置方案。 环境准备 我们假设有两台服务器,IP地址分别是192.168.1.100和192.168.1.101。其中,192.168.1.100作为主服务器,192.…

    other 2023年6月26日
    00
  • thinkPHP模型初始化实例分析

    当我们在ThinkPHP中进行数据库操作时,通常需要定义一个模型来进行数据库的操作。在模型进行操作之前,需要初始化一个包含数据库配置等基础信息的实例。本文将会详细讲解ThinkPHP模型初始化实例的构建方式,方便开发者在进行数据库操作时更加容易上手。 第一步:创建模型 在使用ThinkPHP模型进行数据库操作前,需要先创建一个模型。可以通过命令行工具或者手动…

    other 2023年6月20日
    00
  • PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】

    PHP学习记录之面向对象(Object-oriented programming,OOP)基础 什么是面向对象(OOP)? 面向对象是一种程序设计的方法,采用了面向对象的程序设计方法可以让程序更加灵活、模块化、易于维护和扩展。 OOP 有三个基本概念:类、对象和继承。 类 在 OOP 中,类是对具有相似属性和方法的对象的抽象描述。类定义了一个对象的特征和行为…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部