ConcurrentHashMap介绍与源码

1,什么是ConcurrentHashMap

ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap,所以
ConcurrentHashMap 在并发编程的场景中使用的频率比较高。

2,jdk1.7和jdk1.8下区别

        ConcurrentHashMap 和 HashMap 的实现原理是差不多的,但是因为 ConcurrentHashMap
需要支持并发操作,所以在实现上要比 hashmap 稍微复杂一些。
        在 JDK1.7 的 实 现 上 , ConrruentHashMap 由一个个 Segment 组 成 , 简 单 来 说 ,
ConcurrentHashMap 是一个 Segment 数组,它通过继承 ReentrantLock 来进行加锁,通过
每次锁住一个 segment 来保证每个 segment 内的操作的线程安全性从而实现全局线程安全。
当每个操作分布在不同的 segment 上的时候,默认情况下,理论上可以同时支持 16 个线程
的并发写入。

 

相比于 1.7 版本,它做了两个改进
    1. 取消了 segment 分段设计,直接使用 Node 数组来保存数据,并且采用 Node 数组元素作
        为锁来实现每一行数据进行加锁来进一步减少并发冲突的概率。
    2. 将原本数组+单向链表的数据结构变更为了数组+单向链表+红黑树的结构。为什么要引入
       红黑树呢?在正常情况下,key hash 之后如果能够很均匀的分散在数组中,那么 table 数
        组中的每个队列的长度主要为 0 或者 1.但是实际情况下,还是会存在一些队列长度过长的
        情况。如果还采用单向列表方式,那么查询某个节点的时间复杂度就变为 O(n); 因此对于
        队列长度超过 8 的列表,JDK1.8 采用了红黑树的结构,那么查询的时间复杂度就会降低到
        O(logN),可以提升查找的性能;

 

这个结构和 JDK1.8 版本中的 Hashmap 的实现结构基本一致,但是为了保证线程安全性,
ConcurrentHashMap 的实现会稍微复杂一下。

3,JDK1.8版本的ConcurrentHashMap源码分析

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值