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

news2024/11/23 15:32:27

简介

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.coloradmin.cn/o/1879934.html

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

相关文章

AWT的菜单组件

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

高考结束,踏上西北的美食之旅

高考的帷幕落下,暑期的阳光洒来,是时候放下书本,背上行囊,踏上一场充满期待的西北之旅。而在甘肃这片广袤的土地上,除了壮丽的自然风光,还有众多令人垂涎欲滴的美食等待着您的品尝。当您踏入甘肃&#xff0…

创建一个vue3+vite+ts项目

目录 创建项目 ​编辑 下载jsx 插件 在根目录在新建.env vue.config.js tsconfig.json tsconfig.node.json 下载ui组件库和路由(组件库根据自己的项目需要选择) 在根目录下新建views/index.tsx 在根目录下新建router/index.ts 修改App.vue 创建…

【C++】C++ 网店销售库存管理系统(源码+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

K8S之网络深度剖析(一)(持续更新ing)

K8S之网络深度剖析 一 、关于K8S的网络模型 在K8s的世界上,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(相当于一个网络命名空间,它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的为每个Pod都设置一个IP地址的模型也被称作为I…

What does the error ‘module ‘langchain‘ has no attribute ‘verbose‘ refer to?

题意:错误 module langchain has no attribute verbose 指的是什么意思? 问题背景: Kind of new to Langchain/Qdrant but Im building a recommendation engine to recommend users based on the contents of their associated PDF files, …

Docker配置远程连接

前置条件:docker所在的服务器开放2375端口 文件:/usr/lib/systemd/system/docker.service 节点ExecStart 追加 -H tcp://0.0.0.0:2375

allure安装教程

1、下载 allure的官网下载地址: https://github.com/allure-framework/allure2/releases 注意:官网时常访问失败,可以访问以下网址: https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/ 选择一个版本&…

岗位实习最终篇(汇总)——人力资源管理系统(包含DDL,DML,视图,简单/复杂查询,触发器语句和存储过程语句)

DDL CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 员工ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,first_name VARCHAR(50) NOT NULL COMMENT 名,last_name VARCHAR(50) NOT NULL COMMENT…

leetCode.97. 交错字符串

leetCode.97. 交错字符串 题目思路 代码 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int n s1.size(), m s2.size();if ( s3.size() ! n m ) return false;vector<vector<bool>> f( n 1, vector<bool> (m 1));s1 …

【大数据导论】大数据序言

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 数据概念及类型及可用及组织形式数据概念数据…

阿里云oss实现图片上传

Bucket&#xff1a;存储空间是用户用于存储对象&#xff08;Object&#xff0c;就是文件&#xff09;的容器&#xff0c;所有的对象都必须隶属于某个存储空间。 SDK&#xff1a;Software Development Kit 的缩写&#xff0c;软件开发工具包&#xff0c;包括辅助软件开发的依赖…

黄冈师范学院2024年成人高等继续教育招生简章

黄冈师范学院&#xff0c;这座矗立在湖北黄冈的教育殿堂&#xff0c;以其深厚的文化底蕴和卓越的教学质量&#xff0c;吸引了无数求学者。如今&#xff0c;随着社会的快速发展和教育的不断进步&#xff0c;黄冈师范学院再次敞开怀抱&#xff0c;热烈迎接2024年成人高等继续教育…

详解flink sql, calcite logical转flink logical

文章目录 背景示例FlinkLogicalCalcConverterBatchPhysicalCalcRuleStreamPhysicalCalcRule其它算子FlinkLogicalAggregateFlinkLogicalCorrelateFlinkLogicalDataStreamTableScanFlinkLogicalDistributionFlinkLogicalExpandFlinkLogicalIntermediateTableScanFlinkLogicalInt…

原来“山水博客“的分类也是可以拖动排序的

这二天一直用“山水博客”写文章&#xff0c;发现一个问题&#xff0c;好象它的分类不能调整位置&#xff0c;这可是个大bug。首先&#xff0c;界面上没发现拖动相关按钮&#xff1b;如果按住分类拖动&#xff0c;会成这样&#xff1a; 后来仔细看了它的文档&#xff0c;发现它…

弹性力学讲义

弹性力学讲义 1. 基本假设和一些概念2. 应力3. 二维应力状态与摩尔库伦屈服准则 1. 基本假设和一些概念 力学&#xff1a;变形体力学–固体力学和流体力学&#xff08;连续介质力学&#xff09; 刚体力学–理论力学&#xff08;一般力学&#xff09; 物理受理后&#xff1a;要…

Forecasting from LiDAR via Future Object Detection

Forecasting from LiDAR via Future Object Detection 基础信息 论文&#xff1a;cvpr2022paper https://openaccess.thecvf.com/content/CVPR2022/papers/Peri_Forecasting_From_LiDAR_via_Future_Object_Detection_CVPR_2022_paper.pdfgithub&#xff1a;https://github.co…

聚焦 HW 行动,构筑重保邮件安全防线

随着信息技术的飞速发展&#xff0c;网络安全已成为国家安全的重要组成部分。HW行动作为国家级网络安全演练&#xff0c;通过模拟实战攻防&#xff0c;检验和提升国家关键信息基础设施的防护能力。 CACTER凭借多年HW防护经验&#xff0c;提供全面的邮件安全防护体系&#xff0…

RPC远程过程调用--Thrift

RPC远程过程调用–Thrift 简介 Thrift是一个由Facebook开发的轻量级、跨语言的远程服务调用框架&#xff0c;后进入Apache开源项目。支持通过自身接口定义语言IDL定义RPC接口和数据类型&#xff0c;然后通过编译器生成不同语言代码&#xff0c;用于构建抽象易用、可互操作的R…

从头开始构建一个小规模的文生视频模型

OpenAI 的 Sora、Stability AI 的 Stable Video Diffusion 以及许多其他已经发布或未来将出现的文本生成视频模型&#xff0c;是继大语言模型 (LLM) 之后 2024 年最流行的 AI 趋势之一。 在这篇博客中&#xff0c;作者将展示如何将从头开始构建一个小规模的文本生成视频模型&a…