首页 > 其他分享 >ConcurrentHashMap是怎么实现的?

ConcurrentHashMap是怎么实现的?

时间:2024-09-29 21:47:30浏览次数:9  
标签:怎么 ConcurrentHashMap 哈希 实现 并发 线程 key Segment

1.是什么

    ConcurrentHashMap 是 Java 并发包(java.util.concurrent)中的一个线程安全的哈希表实现。与 HashMap 相比,ConcurrentHashMap 在并发环境下具有更高的性能,因为它允许多个线程并发地进行读写操作而不会导致数据不一致。

以下是 ConcurrentHashMap 实现的一些关键点:

分段锁(Segment Locking)

    ConcurrentHashMap 内部使用了分段锁(Segment Locking)技术,将整个哈希表分割成若干个小的部分,称为段(Segment)。每个段其实就是一个小的哈希表,它们有自己的锁。当对哈希表进行修改时,只需要锁定相应的段,而不需要锁定整个哈希表。这大大减少了锁的竞争,提高了并发性能。

线程安全的操作

ConcurrentHashMap 提供了以下线程安全的操作:

  • get() 方法:由于 get() 方法不会修改表中的任何数据,所以它是完全无锁的,通过volatile读和Unsafe操作来确保读取的数据是最新的。
  • put() 方法:当向 ConcurrentHashMap 中插入数据时,会根据键的哈希值定位到对应的段,并对该段加锁。只有对应的段被锁定,其他段不受影响。
  • size() 方法:计算 ConcurrentHashMap 的大小需要考虑所有段的大小。ConcurrentHashMap 通过尝试多次计算所有段的大小,并在两次尝试之间对所有的段进行加锁,以确保计算的准确性。

实现细节

以下是 ConcurrentHashMap 的一些实现细节:

  • 段(Segment)ConcurrentHashMap 包含一个 Segment 数组,每个 Segment 维护一个哈希表。
  • 哈希表(Hash Entry):每个 Segment 内部包含一个 HashEntry 数组,用于存储键值对。
  • 锁(ReentrantLock):每个 Segment 对象都有一个 ReentrantLock,用于保护其内部的数据结构。

示例解释

假设我们要在 ConcurrentHashMap 中插入一个键值对(key, value):

  1. 计算键(key)的哈希值,确定它应该落在哪个段(Segment)。
  2. 获取对应段的锁。
  3. 在该段内进行插入操作,如果存在键(key)的冲突,会形成链表。
  4. 插入完成后,释放段的锁。

以下是伪代码示例:

public V put(K key, V value) {
    int hash = hash(key);
    Segment<K,V> segment = getSegmentFor(hash);
    return segment.put(key, hash, value, false);
}

// Segment 内部的 put 方法
final V put(K key, int hash, V value, boolean onlyIfAbsent) {
    lock();  // 对当前段加锁
    try {
        // ... 在此处执行插入逻辑 ...
    } finally {
        unlock();  // 释放锁
    }
}

总结

    ConcurrentHashMap 通过分段锁技术,减少了锁的粒度,提高了并发访问的性能。它的设计允许并发读和一定程度的并发写,而不会引起线程安全问题。这些特性使得 ConcurrentHashMap 成为处理并发数据结构时的一个重要选择。

标签:怎么,ConcurrentHashMap,哈希,实现,并发,线程,key,Segment
From: https://blog.csdn.net/2401_83418369/article/details/142644576

相关文章

  • c语言实现:链表创建、插入、删除、翻转
    #include<stdio.h>#include<stdlib.h>//链表创建typedefstructNode{intdata;structNode*next;}Node;//创建一个节点Node*createNode(intdata){Node*newNode=(Node*)malloc(sizeof(Node));newNode->data=data;newNode......
  • 实现平滑移动——路径点法
    想要实现某个对象沿着某条路径进行平滑的移动,可以采用路径点法,大概就是使用transform.translate不断朝着下一个点进行移动,然后营造出平滑的效果。第一种:在前进的路上放置许多的路标,并且将他们存储在数组里面,然后到达某个点再将下一个点拿出来,然后不断朝着点移动。接下来是具......
  • 影刀RPA之接入草料二维码实现自动生成标签图片与打印
    如果您还不认识(影刀RPA)这个宝藏应用强烈建议您阅读这篇文章(影刀RPA之我对这个宝藏应用的见解) 运行的流程和调用的解释说明:其实这个是通过调用草料二维码官方的接口来实现批量生成图片的,然后生成的图片在本地的文件夹内。生成图片的代码可以参考(对接草料二维码批量生成标签......
  • 若依前后端分离版集成x-file-storage插件实现文件上传(以华为云obs为例)
    1.x-file-storage官网  https://x-file-storage.xuyanwu.cn/#/2.打开华为云官网 https://activity.huaweicloud.com/  ①左上角菜单栏中选择产品,输入obs存储            ②根据自己的业务需求选择规格即可            ③购买......
  • C++实现简单的tcp协议
    Server.cpp#include<iostream>#include<winsock2.h>#include<ws2tcpip.h>#pragmacomment(lib,"ws2_32.lib")constintPORT=8888;constintBUFFER_SIZE=1024;intmain(){WSADATAwsaData;intiResult=WSAStartu......
  • 【Web APIs day 03 事件流、事件委托、其他事件:优化多个事件绑定和实现常见网页交互】
    WebAPIs-第3天目标:学习事件流,事件委托,其他事件等知识,优化多个事件绑定和实现常见网页交互事件流移除事件监听其他事件元素尺寸与位置综合案例事件流为什么要学习事件流?可以帮我们解决一些疑惑,比如点击子盒子会会弹出2次的问题事件流指的是事件完整执行过程中的......
  • 基于微服务的助农水果分销系统的设计与实现
    基于SpringCloud的助农水果分销系统的设计与实现基于SpringBoot的商品秒杀购物系统1、项目的设计初衷:​互联网时代不仅仅是通过各种各样的电脑进行网络连接的时代,也包含了移动终端连接互联网进行复杂处理的一些事情。传统的互联网时代一般泛指就是PC端,也就是电脑互联网......
  • jsp爱宠宠物医院管理系统设计与实现0685i--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、课题名称爱宠宠物医院管理系统设计与实现二、研究背景与意义随着宠物市场的不断扩大,宠物医院作为宠物健康保障的重要环节,其管理效率和服务质......
  • jsp爱独居老人网站的设计与实现rig5u--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景随着社会老龄化的加剧,独居老人群体日益庞大,他们面临着生活孤独、健康监测不足、紧急求助困难等问题。为了改善独居老人的生活质量,提升......
  • jsp爱电影网站的设计与实现6nk0x(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着互联网技术的飞速发展,网络娱乐已成为人们日常生活中不可或缺的一部分,其中在线观影因其便捷性、丰富性和互动性而备受青睐。......