ConcurrentHashMap源码详解(与HashMap/HashTable的比较)

先看看速度比HashTable快又比HashMap线程安全的------当红明星ConcurrentHashMap具体使用方法:

在这里插入图片描述

非常的平淡无奇,跟HashMap和HashTable好像是一样东西。
但是,ConcurrentHashMap其实是融合了HashMap/HashTable这两种Hash表数据结构的优点。我们看源码可以知道:
HashTable全部操作方法都是用Java 中自带的synchronized锁强制做同步达到线程安全的,不管是get还是put还是其他一些方法。

在这里插入图片描述

而HashMap就没考虑那么多,它的方法中全部没做线程安全锁处理。具体详细的HashMap介绍请看另外一篇博文: https://blog.csdn.net/whiteBearClimb/article/details/103946465

在这里插入图片描述

因此我们可以得出结论就是HashMap速度快但是线程不安全;HashTable速度慢但是线程安全。

ConcurrentHashMap就是融合它们二者各自的优点。既是线程安全的,速度又相对能较快。那么是怎么实现的呢?看源码:

在这里插入图片描述

继续进去ConcurrentMap看看什么个东西

在这里插入图片描述这些毫无疑问没啥好讲的,我们再看看它最常用的几个方法有什么不同点。

Get方法:

在这里插入图片描述

Put方法:

在这里插入图片描述

这里如果有仔细看过HashMap代码的人瞬间就恍然大悟了,没看过的打开:::https://blog.csdn.net/whiteBearClimb/article/details/103946465 看完也会恍然大悟。
总结:
ConcurrentHashMap速度快,是因为它相对于HashTable的方法锁,细化了锁的粒度,采用了分段锁,分段锁中的分段,其实就是对数组的每个下标做的分段。
只在数组其中一个下标的put方法设置值的方法才加了同步块处理,也就是仅对Hash(Key)得到的index对应的table[i]的下标对应的链表(或者二叉树)进行操作时加的锁,而HashTable的put方法是直接锁住了整个哈希表的,效率低不少;虽然这都能防止出现值覆盖和多线程下resize / rehash的扩容死循环。
get,containsKey和其他的一些方法不加同步。这样操作速度当然会比HashTable快。
而它比HashMap线程安全,也就是因为加了synchronize。

总结:

开发中还是尽量使用ConcurrentHashMap;如果不要求线程安全的话也可以用HashMap,但是HashTable已经是逐步废弃的了。
如果有总结得不对的地方或者理解错的地方可以留言给我,留言必回,鞠躬!

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值