首页 > 编程语言 >ConcurrentHashMap 源码详解

ConcurrentHashMap 源码详解

时间:2023-08-17 12:34:55浏览次数:43  
标签:Node ... ConcurrentHashMap 链表 源码 线程 tab 详解

ConcurrentHashMap 是 Java 提供的一个并发散列映射实现,它允许多个线程同时读写而不需要同步整个数据结构。它是线程安全的,并且相比于其他线程安全的 Map 实现(如 Collections.synchronizedMapHashtable),它提供了更高的并发性能。

以下是 ConcurrentHashMap 的一些核心特性和相应的源码解释:

  1. 分段锁 (Segmentation):
  • 在 Java 8 之前,ConcurrentHashMap 使用了分段锁技术来减少线程竞争,即它将数据分为多个段,每个段有其自己的锁。这样,多个线程可以同时操作不同的段而不会产生锁竞争。
  • 从 Java 8 开始,ConcurrentHashMap 使用了一种不同的策略(基于 CAS 操作),并摒弃了分段锁的设计。
  1. 计算和替换 (compute, merge 等方法):
  • ConcurrentHashMap 提供了一些原子性的高级更新操作,如 computemergecomputeIfAbsent
  1. 扩容 (Resizing):
  • 当一个 ConcurrentHashMap 在添加元素时超过了其容量阈值,它会自动进行扩容操作。

以下是与 ConcurrentHashMap 功能相关的源码片段和解释:

putVal 方法

final V putVal(K key, V value, boolean onlyIfAbsent) {
    // ...一些检查...
    int binCount = 0;
    for (Node<K,V>[] tab = table;;) {
        Node<K,V> f; int n, i, fh;
        if (tab == null || (n = tab.length) == 0)
            tab = initTable(); // 初始化表
        // ...主要逻辑,包括处理冲突,链表转红黑树等...
    }
}

这个方法是 put 操作的主要逻辑,它处理各种情况,例如初始化表、处理键的冲突和链表的转换。

getNode 方法

final Node<K,V> getNode(int hash, Object key) {
    // ...一些检查...
    for (Node<K,V> e = tabAt(tab, i = (n - 1) & hash); e != null; e = e.next) {
        // ...遍历链表或树来查找键...
    }
}

这个方法用于获取一个具有给定哈希值和键的节点。它首先计算键的位置,然后遍历链表或树来查找。

resize 方法

这是扩容操作的核心,当 ConcurrentHashMap 增长并超过其容量阈值时,将调用此方法。扩容可以提高查找效率,因为它减少了冲突。

这只是 ConcurrentHashMap 的冰山一角。为了全面了解其实现细节,建议您深入查看其源代码和相关的 Javadoc。

标签:Node,...,ConcurrentHashMap,链表,源码,线程,tab,详解
From: https://blog.51cto.com/u_12749768/7120652

相关文章

  • DataBinding开始使用以及布局详解
    DataBinding开始使用了解如何为您的开发环境支持使用DataBinding,包括在AndroidStudio中支持数据绑定代码。DataBinding提供了灵活性和广泛的兼容性-它是一个支持库,因此您可以将其用于运行Android4.0(API14级)或更高版本的设备。我们建议在您的项目中使用最新的AndroidGradle插件......
  • 鸿蒙入门开发教程:一文带你详解工具箱元服务的开发流程
    鸿蒙入门开发教程:一文带你详解工具箱元服务的开发流程一,基本概念元服务(原名原子化服务)是一种基于HarmonyOSAPI的全新服务提供方式,以HarmonyOS万能卡片等多种呈现形态,向用户提供更轻量化的服务。具有即用即走、信息外显、服务直达的特性。万能卡片(简称卡片)是一种界面展示形式,可......
  • 基于微信小程序的网上交易平台的设计与实现-计算机毕业设计源码+LW文档
    摘 要随着互联网技术的发展,传统的商品销售迎来了机遇,我国是个人口大国,商品的需求量大,如何推广商品的销售是企业非常关注的事情。随着电子商务多元化的发展,各种类型的商品逐渐转移到线上销售。在互联网的帮助下,带动企业打开销路,促进商品销售的可持续发展。同时,通过基于微信小程......
  • 会议记录管理系统-计算机毕业设计源码+LW文档
    摘 要随着信息技术的发展,管理系统越来越成熟,各种企事业单位使用各种类型的管理系统来提高工作效率,从而降低手工劳动的弊端。公司一直以来都非常重视公司信息化的发展,近几年来随着公司规模扩大,业务逐渐增加,公司对会员的管理也愈发的困难。因此,公司提出通过开发会议记录管理系统......
  • [BitSail] Connector开发详解系列三:SourceReader
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群SourceConnector本文将主要介绍负责数据读取的组件SourceReader:SourceReader每个SourceReader都在独立的线程中执行,只要我们保证SourceSplitCoordinator分配给不同SourceReader的切片没有交集,在S......
  • 基于PHP的花茶交流平台的设计与实现-计算机毕业设计源码+LW文档
    摘  要现在这种紧张压抑的生活状态,人们已经渐渐忘记了原本的样子,我们有时会想着去放下手中的工作,学会享受生活,品鉴人间趣味。在我国近五千年的历史长河中,茶文化对人们来说有着深厚含义。对于有着丰富生活阅历的人来说,品茶聊天就是最佳休闲方式。借此我产生了灵感设计了茶交流......
  • [BitSail] Connector开发详解系列三:SourceReader
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群SourceConnector本文将主要介绍负责数据读取的组件SourceReader:SourceReader每个SourceReader都在独立的线程中执行,只要我们保证SourceSplitCoordinator分配给不同SourceReader的切......
  • Java中Date方法详解
    先进行专栏介绍本专栏是自己学Java的旅途,纯手敲的代码,自己跟着黑马课程学习的,并加入一些自己的理解,对代码和笔记进行适当修改。希望能对大家能有所帮助,同时也是请大家对我进行监督,对我写的代码进行建议,互相学习。Date方法Date类是用于表示日期和时间的类。它提供了一系列的方......
  • 基于SpringBoot的点餐系统的设计与实现-计算机毕业设计源码+LW文档
    摘要:随着移动互联网的快速发展,微信小程序作为一种轻量级、快速启动、无需下载安装的应用程序形式,在市场中越来越受欢迎。同时,餐饮行业也是一个充满机会的领域,尤其是在新冠疫情后,外卖、自取等模式逐渐成为餐饮行业的主要销售方式。因此,开发一款基于微信小程序的点餐系统,能够提高餐......
  • 基于微信小程序的景区服务系统-计算机毕业设计源码+LW文档
    摘要随着社会经济的发展,各行业竞争激烈,年轻群体工作压力大,越来越多的人希望通过旅游来缓解压力。而传统的旅行社都是通过事先定制的线路和固定时间,没有个性化定制服务,不能满足现代用户的需求。对于此,开发景区服务系统可以很好的解决用户个性化旅游的服务,通过系统查询各种景点信息,......