深入理解ConcurrentHashMap的原理和实现

概念

在多线程高并发环境下,使用HashMap进行put、remove操作时存在数据丢失的情况,也就是说HashMap是非线程安全的,因为HashMap底层代码操作数组的数据并未加锁,为了避免这个隐患,强烈推荐使用ConcurrentHashMap代替HashMap。

HashTable是一个线程安全类,实际上它底层使用 synchronized 来锁住整张 hash 表来实现线程安全,即每次锁住整张表让线程独占,相当一所有的线程进行读写时都去竞争同一把锁,导致效率非常低下,而ConcurrentHashMap可以做到读取数据的时候不加锁,并且其内部结果可以让其在进行写操作的时候能把锁的颗粒度保持尽量最小,允许多个修改操作同时进行,其关键于使用了分段锁机制,它使用了多个锁来控制对hash表的不同部分就那些修改。

对于JDK1.7版本的实现,ConcurrentHashMap内部使用段(Segemnt)来说表示不同的16个部分,也就是一个 Segment 数组,一个 Segment 数组里面包含 HashEntry 数组,当对某个 HashEntry 数组中的元素进行修改时,必须首先获得该元素所属 HashEntry 数组对应的 Segment 锁,每个Segment都有自己独立的锁,只要多个修改操作发生在不同段上,它们就可以并行执行。

JDK1.8的实现降低了锁的颗粒度,不同于JDK1.7版本的Segemnt数组+HashEntry链表,JDK1.8版本中的ConcurrentHashMap直接抛弃了Segment锁,一个ConcurrentHashMap包含一个Node数组(和HashEntry实现差不多),每个Node是一个链表结构,并且在链表长度大于一定值时会自动转换为红黑树结构(TreeBin)。

对比

HashMap和ConcurrentHashMap示意图

深入理解ConcurrentHashMap的原理和实现

深入理解ConcurrentHashMap的原理和实现

深入理解ConcurrentHashMap的原理和实现

ConcurrentHashMap在JDK 7和8之间的区别


作者:austin流川枫
链接:https://juejin.cn/post/7115635447790829598

展开阅读全文

页面更新:2024-04-14

标签:复杂度   粒度   数据结构   数组   线程   底层   加锁   原理   版本   操作   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top