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.mzph.cn/news/863698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

左耳听风_032_31_编程范式游记2-_泛型编程

你好,我是陈浩网名英,做耳朵house.在上一节课中呢,我们从c语言开始说起,聊了聊面向过程式的辩证范式。 那相信从代码的角度呢,你对这种类型的语言啊已经有了一些理解。 那作为一门高级语言呢,c语言啊它绝…

python进阶函数

目录 函数多返回值函数多种传参方式匿名函数 函数多返回值 问:如果一个函数如些两个return(如下所示),程序如何执行? def return_num():return 1return 2result return_num() print(result)答:只执行了第…

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而,这种快速增长也吸引了恶意行为者的注意,他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上,但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…

DDD学习笔记三

模型的构造块:实体、值对象、领域服务 (1)实体的领域特征 在领域中,一个由身份而不是属性值定义的客观概念就是实体,这个身份可以由一个唯一标识确认。 一个概念是否是实体取决于系统的应用场景,一个标识是…

ORA-00903: invalid table name\nORA-06512: at line 1\n

错误信息 ORA-00903: invalid table name\nORA-06512: at line 1\n原因 ORA-00903: invalid table name 解释: 这个错误表示在 SQL 语句中使用了无效的表名。 由于在建表中出现了以数字开头的表名,所以出现以下错误 解决方案 表名不能以数字开头

RabbitMQ交换器类型

直连交换机(Direct Exchange) 直连交换机的工作方式是最简单的路由模式,它会根据消息的routing key将其精确地路由到与之绑定的队列上。每个队列通过一个特定的routing key与交换机绑定。如果一条消息的routing key与队列的绑定键完全匹配&am…

AWT的菜单组件

AWT的菜单组件 前言一、菜单组件的介绍常见的菜单相关组件常见菜单相关组件集成体系图菜单相关组件使用小要点 二、AWT菜单组件的代码示例示例一示例二实现思路 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默&…

【Python】Pickle:Python对象序列化与反序列化的利器

在Python编程中,我们经常需要在程序的不同运行之间保存和加载数据,这时候,Python标准库中的pickle模块就派上了用场。pickle模块可以将Python对象序列化为字节流,便于存储到文件或通过网络传输;同时,它也可…

CentOS 7 和 CentOS Stream 8 的主要区别

更新频率: CentOS 7:传统的稳定版本,主要用于生产环境,更新频率较低,主要包含安全补丁和重要修复。CentOS Stream 8:滚动发布版本,更新更频繁,包含最新的特性和改进。它处于 Fedora …

springboot汽车租赁管理系统-计算机毕业设计源码08754

目 录 摘 要 第 1 章 引 言 1.1 选题背景和意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点,有学者在小波分析基础上引入调频算子构成了线性调频小波变换,线调频小波一方面继承了小波变换的理论完善性,另一方面用一个新的参数(线调频参数)刻…

Nginx 配置文件

Nginx的配置文件的组成部分: 主配置文件:nginx.conf子配置文件:include conf.d/*.conf 全局配置 nginx 有多种模块 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机…

46 - 删除重复的电子邮箱(高频 SQL 50 题基础版)

46 - 删除重复的电子邮箱 delete p1 from Person p1,Person p2 where p1.emailp2.email and p1.id>p2.id;

跟着DW学习大语言模型-使用Streamlit构建一个RAG应用

在大语言模型 (LLMs) 的应用中,我们面临众多挑战,包括领域知识的缺乏、信息的准确性问题以及生成的虚假内容。检索增强生成 (RAG) 通过引入外部知识库等额外信息源,为这些问题提供了有效的缓解策略。RAG 在那些需要不断更新知识的知识密集型场…

ios13多窗口(UIWindowScene)学习笔记

ios13引入了UIWindowScene类、UIWindowSceneDelegate协议以便支持多窗口功能,但其适用于ipad,不适用于iphone,因为iphone不支持多窗口功能。注意,这里说的窗口不是UIWindow,而是UIWindowScene。 ios13前后的app的UI架…

2024年【建筑电工(建筑特殊工种)】考试试题及建筑电工(建筑特殊工种)模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 2024年【建筑电工(建筑特殊工种)】考试试题及建筑电工(建筑特殊工种)模拟考试题库,包含建筑电工(建筑特殊工种)考试试题答案和解析及建筑电工(建筑特殊工种)模拟考试题库练习。安全生产模拟考试一点通结合…

2024年【广东省安全员A证第四批(主要负责人)】新版试题及广东省安全员A证第四批(主要负责人)考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 2024年【广东省安全员A证第四批(主要负责人)】新版试题及广东省安全员A证第四批(主要负责人)考试试卷,包含广东省安全员A证第四批(主要负责人&am…

Go线程实现模型-P

P 概述 P是G能够在M中运行关键。Go的运行时系统会适时地让P与不同的M建立或断开关联,以使P中的那些可运行的G能够及时获得,这与操作系统内核在CPU之上实时切换不同进程或线程的情况类似 改变P的数量 改变单个Go程序间拥有的P的最大数量有两种方法 调…

Scala编程的瑞士军刀:包对象的威力与应用

标题:Scala编程的瑞士军刀:包对象的威力与应用 在Scala编程中,包对象(Package Object)是一种非常有用的工具,它允许开发者在包级别共享代码,而无需创建单独的类或对象。包对象是单例的&#xf…

【LLM中不同GGUF格式存储和表示模型参数的用途和硬件要求】

LLM中不同GGUF格式存储和表示模型参数的用途和硬件要求 1. 模型参数类型2. 使用场景 在大语言模型(LLM)中,GGUF格式是一种存储和表示模型参数的方法。不同的格式和参数类型各有其优缺点,适用于不同的用途和硬件要求。下面是对这些…