问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ConcurrentHashMap

发布网友 发布时间:2023-07-10 09:31

我来回答

1个回答

热心网友 时间:2024-10-23 04:36

HashMap是我们用得非常频繁的一个集合,但是它是线程不安全的。并且在多线程环境下,put操作是有可能产生死循环,不过在JDK1.8的版本中更换了数据插入的顺序,已经解决了这个问题。

为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式。一个线程在读时其他线程必须等待,吞吐量较低,性能较为低下。而J.U.C给我们提供了高性能的线程安全HashMap:ConcurrentHashMap。

在1.8版本以前,ConcurrentHashMap采用分段锁的概念,使锁更加细化,但是1.8已经改变了这种思路,而是利用CAS+Synchronized来保证并发更新的安全,当然底层采用数组+链表+红黑树的存储结构。

HashMap 是最简单的,它不支持并发操作,下面这张图是 HashMap 的结构:

HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。每个绿色的实体是嵌套类 Entry 的实例,Entry 包含四个属性:key, value, hash 值和用于单向链表的 next。

public HashMap(int initialCapacity, float loadFactor) 初始化方法的参数说明:

put 过程

get过程

ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些。

整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多人都会将其描述为分段锁。简单的说,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的。

再具体到每个 Segment 内部,其实每个 Segment 很像之前介绍的 HashMap,每次操作锁住的是一个 segment,这样只要保证每个 Segment 是线程安全的。

初始化

public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) 初始化方法

举个简单的例子:

用 new ConcurrentHashMap() 无参构造函数进行初始化的,那么初始化完成后:

put过程

get过程

Java8 对 HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+红黑树 组成。

根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度。

为了降低这部分的开销,在 Java8 中,当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度。

jdk7 中使用 Entry 来代表每个 HashMap 中的数据节点,jdk8 中使用 Node,基本没有区别,都是 key,value,hash 和 next 这四个属性,不过,Node 只能用于链表的情况,红黑树的情况需要使用 TreeNode。

我们根据数组元素中,第一个节点数据类型是 Node 还是 TreeNode 来判断该位置下是链表还是红黑树的。

put过程

和jdk7的put差不多

get 过程分析

Java7 中实现的 ConcurrentHashMap 还是比较复杂的,Java8 对 ConcurrentHashMap 进行了比较大的改动。可以参考 Java8 中 HashMap 相对于 Java7 HashMap 的改动,对于 ConcurrentHashMap,Java8 也引入了红黑树。

在1.8版本以前,ConcurrentHashMap采用分段锁的概念,使锁更加细化,但是1.8已经改变了这种思路,而是利用CAS+Synchronized来保证并发更新的安全,底层采用数组+链表+红黑树的存储结构。

ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。线程安全的容器,特别是Map,很多情况下一个业务中涉及容器的操作有多个,即复合操作,而在并发执行时,线程安全的容器只能保证自身的数据不被破坏,和数据在多个线程间是可见的,但无法保证业务的行为是否正确。

ConcurrentHashMap总结:

案例2:业务操作的线程安全不能保证

案例3:多线程删除

12.7 对比Hashtable
Hashtable和ConcurrentHashMap的不同点:

Hashtable对get,put,remove都使用了同步操作,它的同步级别是正对Hashtable来进行同步的,也就是说如果有线程正在遍历集合,其他的线程就暂时不能使用该集合了,这样无疑就很容易对性能和吞吐量造成影响,从而形成单点。而ConcurrentHashMap则不同,它只对put,remove操作使用了同步操作,get操作并不影响。
Hashtable在遍历的时候,如果其他线程,包括本线程对Hashtable进行了put,remove等更新操作的话,就会抛出ConcurrentModificationException异常,但如果使用ConcurrentHashMap的话,就不用考虑这方面的问题了

线程安全的集合有哪些

线程安全的集合包括:ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等。以下是对这些线程安全集合的详细解释:ConcurrentHashMap:它是一种线程安全的哈希表实现,允许多个线程同时对其进行读写操作。与传统的Hashtable相比,ConcurrentHashMap采用了分段锁技术,即不同的线程可以操作不同的段,从而...

ConcurrentHashMap确实很复杂,这样学源码才简单

ConcurrentHashMap相较于HashMap在实现上更为复杂,主要涉及多线程环境下的并发安全、同步和锁的概念。虽然HashMap的原理主要围绕数组、链表、哈希碰撞和扩容,但在多线程场景下,这些知识还不够,需要对并发和同步有深入理解。在实际编程中,HashMap经常被使用,而ConcurrentHashMap的使用频率却相对较低,这...

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

因为Segment本身是基于ReentrantLock重入锁实现的加锁和释放锁的操作,这样就能保证多个线程同时访问ConcurrentHashMap时,同一时间只能有一个线程能够操作相应的节点,这样就保证了ConcurrentHashMap的线程安全。也就是说ConcurrentHashMap的线程安全是建立在Segment加锁的基础上的,所以,我们称它为分段锁或者片段...

HashMap、ConcurrentHashMap、HashTable的区别

引入 ConcurrentHashMap 是为了在同步集合HashTable之间有更好的选择, HashTable 与 HashMap 、 ConcurrentHashMap 主要的区别在于HashMap不是同步的、线程不安全的和不适合应用于多线程并发环境下,而 ConcurrentHashMap 是线程安全的集合容器,特别是在多线程和并发环境中,通常作为 Map 的主要实现。除了...

concurrenthashmap1.7和1.8的区别

concurrenthashmap1.7和1.8的区别:整体结构:1.7:Segment + HashEntry + Unsafe;1.8: 移除Segment,使锁的粒度更小,Synchronized + CAS + Node + Unsafe。

为什么ConcurrentHashMap不允许插入null值?

2、歧义问题因为给ConcurrentHashMap中插入?null?(空)值会存在歧义。我们可以假设ConcurrentHashMap允许插入?null(空)?值,那么,我们取值的时候会出现两种结果:1、值没有在集合中,所以返回的结果就是?null?(空);2、值就是?null(空),所以返回的结果就是它原本的?null(空)?值。这就产生...

Java高并发编程实战7,ConcurrentHashMap详解

进到JDK1.8版本,ConcurrentHashMap进一步优化,其数据结构转变为数组与链表或红黑树的结合,锁的粒度更细,性能更佳。当链表长度超过8时,链表会升级为红黑树。同时,ConcurrentHashMap废弃了segment,直接使用volatile HashEntry对象存储,通过volatile关键字避免冲突。此外,它利用synchronized和CAS算法保证线程...

concurrenthashmap1.8源码如何详细解析?

ConcurrentHashMap在JDK1.8的线程安全机制基于CAS+synchronized实现,而非早期版本的分段锁。在JDK1.7版本中,ConcurrentHashMap采用分段锁机制,包含一个Segment数组,每个Segment继承自ReentrantLock,并包含HashEntry数组,每个HashEntry相当于链表节点,用于存储key、value。默认支持16个线程并发,每个Segment独立...

HashMap、HashTable、HashSet、concurrentHashMap 线程安全,区别,实现...

concurrentHashMap是Java 5引入的线程安全Map实现,它通过分段锁(Segment)提高并发性能。每个Segment是一个小的HashTable,有自己的锁,不同段上的修改操作可以并发进行。与Hashtable不同,它不是锁整个hash表,而是锁特定的段,这极大地提高了并发处理能力。对于学习这些数据结构,可以参考以下链接进行深入...

18. ConcurrentHashMap 的 get 方法

ConcurrentHashMap的get方法实现如下(简化版):首先计算键的哈希值,利用该哈希值定位到对应的槽位(即数组索引)。接着,遍历该槽位链表,查找与指定键相等的节点。若找到,则返回该节点的值;若未找到,则返回null。值得注意的是,此方法为线程安全,意味着多个线程可同时调用,而不会导致数据不一致...

concurrenthashmap底层原理 concurrenthashmap加锁机制 ConcurrentHashMap原理 currenthashmap线程安全 concurrenthashmap图解 concurrenthashmap遍历 hashmap和ConcurrentHashMap区别 concurrenthashmap线程不安全 ConcurrentHashMap不扩容
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
重本和一本一样吗 永劫无间是第几人称:小说叙事视角分析 名字未定(第三人称双男主 周霖 温宿) 我得了职业病〈轻度苯中毒〉,有职业病诊断证明书.工伤认定期间我没上... ...后来感觉麻烦,就直接去药店买药,他开了很多 这是十年前的功放,求高手看看那几个孔是什么? 车子断保险之后再交是一样的吗 车险断交后再续交 女性查激素六项什么时候检查 有一个素质很低下的室友是一种什么样的体验? 新鲜笋子煮麻辣鱼怎么做 笋子煮麻辣鱼的做法 ...类似吉尔莫女孩、雪山镇、南国医恋那种温馨轻松的。 为什么我的Steam平台双击后,很慢才在桌面上显示? 求现在有什么温馨的电视剧?看了能让人内心舒服的? 坐飞机可以带一下物品吗? 公司招聘新员工需要老员工带一下但资深老员工说我很忙没有时间怎么办... 单位来了一位新人,领导让我带一下,但是新人每天只顾自己的事,不会主动... 去大学需要带一下什么东西 ...现在有了自己的经济,他们让我带一下他们,到底要不要带他们 福特主义生产模式的特征是()。 网友对我说,搞啥好事,带一下,我怎么回复网友的话? 岗松,松叶针,五色花可以一起煮汤喝吗? 可以带一下吗? 三棵树悦享家典粹多效是什么档次 别人都以为你有无数的暧昧关系,却不知你为了某个人孤单的像条狗? 每个人都觉得我过得很好不缺钱花朋友很多有数不清的暧昧关系 别人都以为你和很多人有暧昧呢 别人以为你有数不清的暧昧 所有人以为你有很多暧昧 “红了樱桃绿了芭蕉”这句诗是李清照写的吗 去庙里烧香被香灰烫到了手,怎么办? 酷讯科技机顶盒怎么样 为什么越到预产期越烦躁 快生了心情烦躁怎么办 生产前一个月情绪不稳定,老是想哭,却又不知道为啥哭是不是产前抑郁症... 临近预产期心情烦躁 酷乐音箱如何串联音响设置 ...当四边形ACBD满足什么条件时,四边形EFGH是矩形? ...当四边形abcd满足什么条件时,四边形efgh是矩形 ...CD、AD上,四边形EFGH是矩形,EF=2FG,那么矩形EFGH与正方 ...当四边形ABCD满足什么条件时,四边形EFGH是矩形? 如图,在四边形ABCD中,点E、G分别是AD、BC的中点,F、H分别是BD、AC的中 ... ...F、H分别是BD、AC的中点.(1)当AB、CD满足什么条件时,四边_百度... ...H分别是BD、AC的中点,AB、CD满足什么条件时,四边形EFGH是矩形... 已知四边形ABCD中,AD与BC不平行,E、F、G、H分别是线段AB、AC、CD... ...AD的中点,当四边形ABCD满足什么条件时,四边形EF E、F、G、H分别是空间四边形ABCD四边的中点,则空间四边形ABCD分别满足... 如果从一个自媒体小白成为一个自媒体大咖 ...点击手掌动作开启屏幕截取但仍然无法手势截屏。该怎么办? 三星s5手掌截图不好使阿 ...还说我用第三方软件,我连那啥都不知道,求免费解封方法