天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。

面试官:说说 ConcurrentHashMap 线程安全的实现原理?

itzoo 460次浏览 0个评论

点击“终码一生”,关注,置顶公众号

每日技术干货,第一时间送达!



JDK1.7的ConcurrentHashMap


首先,将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。


ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。


Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。


java static class Segment extends ReentrantLock implements Serializable { }


一个 ConcurrentHashMap 里包含一个 Segment 数组。Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。


JDK1.8的ConcurrentHashMap


ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构类似,数组+链表/红黑二叉树。Java 8在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为O(N))转换为红黑树(寻址时间复杂度为O(log(N)))


synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。


PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。


往期推荐



快醒醒,Cookie + Session 的时代已经过去了

Redis 击穿、穿透、雪崩产生原因以及解决思路

Redis 如何高效实现点赞、取消点赞功能

MySQL 性能优化的 9 种姿势,面试再也不怕了!

牛逼!微软新出的写代码神器…

新版 IntelliJ IDEA2021.3 即将来袭,这次又出了哪些神仙功能!



ITZOO版权所有丨如未注明 , 均为原创丨转载请注明来自IT乐园 ->面试官:说说 ConcurrentHashMap 线程安全的实现原理?
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址