ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介

ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表(HashMap)实现。它具有以下几个显著的特点和优点,适合在特定的并发场景中使用:

  1. 线程安全性

    • ConcurrentHashMap 提供了并发访问的线程安全保证,可以安全地在多线程环境中进行读取和写入操作,而无需显式地使用外部同步机制(如 synchronized)。
  2. 分段锁设计:--- jdk 1.7

    • ConcurrentHashMap 使用了分段锁(Segmented Locking)的技术,内部分为多个段(Segment),每个段都类似于一个小的 HashMap,各自维护一部分数据。
    • 默认情况下,ConcurrentHashMap 中有 16 个段,因此支持最多 16 个线程同时进行写操作,这提高了并发性能。
  3. 高并发性能

    • 分段锁设计使得 ConcurrentHashMap 在读操作上可以实现真正的并发访问,即使在写操作也只会锁住对应的段而不是整个表,因此不同段之间的操作可以并行执行,提高了并发性能。
  4. 扩展性和灵活性

    • ConcurrentHashMap 在初始化时可以指定段的数量,可以根据实际需求调整以平衡并发性能和内存消耗。
    • 它支持高并发的写入操作,同时保持良好的读取性能,适合于大部分读多写少的并发场景。
  5. 迭代安全性

    • ConcurrentHashMap 在进行迭代时,不会抛出 ConcurrentModificationException 异常,因为它通过一种复杂的方式确保迭代器能够安全地遍历表中的元素,即使在并发修改的情况下也能保证一定的可靠性。

应用场景

ConcurrentHashMap 适用于需要高并发访问且需要线程安全的场景,特别是在以下情况下可以考虑使用它:

  • 缓存:作为缓存的数据结构,支持并发的读写操作,适用于需要快速访问和更新的缓存系统。

  • 高并发计数器:用于统计访问次数或计数器的场景,例如网站访问统计、计数等。

  • 分布式任务分发:在任务分发时,可以使用 ConcurrentHashMap 来存储任务状态或结果,多个线程可以并发地更新任务状态。

  • 实时数据处理:对于需要实时更新和处理的数据结构,如实时日志处理系统,ConcurrentHashMap 可以支持高并发的写入和查询操作。

总之,ConcurrentHashMap 是一个强大的并发工具,通过其优化的设计和分段锁机制,能够在高并发环境下提供良好的性能和线程安全保证,是并发编程中常用的选择之一。

ConcurrentHashMap是如何保证线程安全的?

ConcurrentHashMap 在 Java 7 中采用了一种称为分段锁(Segmented Locking)的机制来保证线程安全性。具体来说,它的线程安全性是通过以下几个关键点来实现的:

  1. 分段锁机制:--- jdk 1.7

    • ConcurrentHashMap 内部维护了一个由多个段(Segment)组成的数组,每个段其实就是一个小的 HashTable。
    • 默认情况下,ConcurrentHashMap 中有 16 个段,理论上可以支持同时进行 16 个写操作(插入或更新)。
  2. 段内操作的加锁

    • 每个段都是一个独立的 HashTable,它们之间是相互独立的,因此在进行操作时,只需要锁定需要操作的段,而不影响其他段的操作。
    • 这样做的好处是,在多线程的情况下,不同段的操作可以并行进行,提高了并发性能。
  3. 保证可见性

    • ConcurrentHashMap 使用了 volatile 变量来保证段数组的可见性,确保一个线程对段数组所做的修改对其他线程是可见的。
    • 这样可以避免由于缓存一致性导致的问题。
  4. 写操作的安全性

    • 在写操作(插入或更新)时,需要锁定对应的段,但这个锁定是针对段而不是整个 ConcurrentHashMap,这样做提高了并发度。
    • 这种方式下,不同段之间的写操作可以并行执行,只有在同一个段上的写操作才会被阻塞。
  5. 读操作的安全性

    • 读操作通常不需要加锁,因为段内的 HashTable 是线程安全的,读取操作是非阻塞的。

总结来说,ConcurrentHashMap 通过分段锁的方式,在保证整体数据一致性的同时,提高了并发度,避免了传统的全局锁对并发性能的影响。这种设计使得在多线程环境中,ConcurrentHashMap 可以提供较高的并发访问性能。

Java 8 ConcurrentHashMap 线程安全分析

CAS自旋(sun.misc.Unsafe U   # compareAndSwapObject) +  synchronized

源码分析 put(key,value)

如下判断顺序,保证先后关系:

1、如果map中的核心数组为空,那么当前线程尝试进行cas初始化数组,然后再次尝试put;

2、如果数组不为空,并且map中【数组at位置-哈希槽】为空,代表这个哈希槽没有node,那么尝试cas设置当前node到这个位置上;

3、如果数组中【数组at位置-哈希槽】不为空,并且当前位置node节点正在【转移-扩容中】,那么当前线程帮助旧的node进行转移;

4、如果数组在【数组at位置-哈希槽】不为空,并且位置node没有发生转移,则对哈希槽Node进行加锁,锁定位置,然后添加新的Node到链表或者红黑树中;

如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/779480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Keras实战之图像分类识别

文章目录 整体流程数据加载与预处理搭建网络模型优化网络模型学习率Drop-out操作权重初始化方法对比正则化加载模型进行测试 实战:利用Keras框架搭建神经网络模型实现基本图像分类识别,使用自己的数据集进行训练测试。 问:为什么选择Keras&am…

RedHat9 | Zabbix-Server监控服务部署

系统版本以及软件版本 使用的系统版本: Red Hat Enterprise Linux release 9.2 软件版本: zabbix-release-7.0-3.el9.noarchzabbix-web-7.0.0-release1.el9.noarchzabbix-web-mysql-7.0.0-release1.el9.noarchzabbix-web-deps-7.0.0-release1.el9.noar…

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录,注册、首页、订餐、购物车,我的。 用户注册后,登陆客户端即可完成订餐、浏览菜谱等功能,点餐,加入购物车,结算,以及删减…

【电商纯干货分享】干货速看!电商数据集数据API接口数据分析大全!

数据分析——深入探索中小企业数字化转型,专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板,为钻研于数据分析的朋友们加油充电。 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中&#xff09…

Unity编辑器扩展之Inspector面板扩展

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity编辑器扩展之Inspector面板扩展 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取&#xff…

Java--Super

1.super调用父类的构造方法,必须在构造方法的第一个 2.super必须只能出现在子类的方法或者构造方法中 3.super和this不能同时调用构造该方法 和this差别 1.代表的对象不同 this():代指本身调用者这个对象 super(&a…

Docker-文件分层与数据卷挂载详解(附案例)

文章目录 文件分层数据卷挂载的含义数据卷挂载实践数据卷挂载案例数据卷挂载方式数据卷常用命令容器间数据共享 更多相关内容可查看 文件分层 例:拉取mysql5.7的镜像,在继续拉取mysql5.8的镜像,会出现一部分文件已存在的现象 这种分层技术 是…

同花顺问财选股,使用自然语言的形式调接口选股

http形式的接口调用问财接口:https://stockapi.com.cn/v1/base/xuangu?strategy创业板,竞价涨幅大于1,竞价量比大于1 代码中调用该接口调试数据。

cmake编译源码教程(一)

1、介绍 本次博客介绍使用cmake编译平面点云分割的源代码,其对室内点云以及TLS点云中平面结构进行分割,分割效果如下: 2、编译过程 2.1 源代码下载 首先,下载源代码,如下所示,在该文件夹下新建一个build文件夹,用于后续生成sln工程。 同时,由于该库依赖open…

什么是 DDoS 攻击及如何防护DDOS攻击

自进入互联网时代,网络安全问题就一直困扰着用户,尤其是DDOS攻击,一直威胁着用户的业务安全。而高防IP被广泛用于增强网络防护能力。今天我们就来了解下关于DDOS攻击,以及可以防护DDOS攻击的高防IP该如何正确选择使用。 一、什么是…

springboot云南特色民宿预约系统-计算机毕业设计源码81574

目 录 第 1 章 引 言 1.1 选题背景 1.2 选题目的 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

idea使用技巧---超实用的mybatisX插件

一、使用原因 传统创建mybatis项目之后,在mapper接口和xml映射文件之间手动切换非常麻烦:不仅需要记住文件的所在位置,而且每次在mapper当中添加一个新的接口,都需要单独手动点开xml再编写sql; eg:在item…

前端面试题22(js中sort常见的用法)

JavaScript 的 sort() 方法是数组的一个非常强大的功能,用于对数组的元素进行排序。这个方法直接修改原数组,并返回排序后的数组。sort() 的默认行为是将数组元素转换为字符串,然后按照字符串的 Unicode 字典顺序进行排序。这意味着如果你试图…

优化路由,优化请求url

1、使用父子关系调整下使其更加整洁 2、比如说我修改了下url,那所有的页面都要更改 优化:把这个url抽出来,新建一个Api文件夹用于存放所有接口的url,在业务里只需要关注业务就可以 使用时 导包 发请求 如果想要更改路径,在这里…

docker-compose Install gitlab 17.1.1

gitlab 前言 GitLab 是一个非常流行的开源 DevOps 平台,用于软件开发项目的整个生命周期管理。它提供了从版本控制、持续集成/持续部署(CI/CD)、项目规划到监控和安全的一系列工具。 前提要求 Linux安装 docker docker-compose 参考Windows 10 ,11 2022 docker docker-c…

Zookeeper分布式锁原理说明【简单易理解】

Zookeeper 非公平锁/公平锁/共享锁 。 1.zookeeper分布式锁加锁原理 如上实现方式在并发问题比较严重的情况下,性能会下降的比较厉害,主要原因是,所有的连接都在对同一个节点进行监听,当服务器检测到删除事件时,要通知…

【Kafka】Kafka生产者开启幂等性后报错:Cluster authorization failed.

文章目录 背景解决服务端配置ACL增加授权 背景 用户业务需求,需要开启生产者的幂等性,生产者加了配置:enable.idempotence true用户使用的集群开启了ACL认证:SASL_PLAINTEXT/SCRAM-SHA-512用户生产消息时报错:org.ap…

惕佫酰假托品合酶的发现-文献精读28

Discovering a mitochondrion-localized BAHD acyltransferase involved in calystegine biosynthesis and engineering the production of 3β-tigloyloxytropane 发现一个定位于线粒体的BAHD酰基转移酶,参与打碗花精生物合成,并工程化生产惕佫酰假托品…

Git在多人开发中的常见用例

前言 作为从一个 svn 转过来的 git 前端开发,在经历过git的各种便捷好处后,想起当时懵懂使用git的胆颤心惊:总是害怕用错指令,又或者遇到报错就慌的场景,想起当时查资料一看git指令这么多,看的头晕眼花&am…