ConcurrentHashMap 实现原理
HashMap 是非线程安全的,HashTable 是线程安全的,在不考虑性能问题的时候,多线程下可以使用 Hashtable 与 Collections.synchronizedMap(),这两种方式基本都是对整个 hash 表结构做锁定操作,这表明在锁定期间别的线程就需要等待,无疑性能不高,HashTable 容器在竞争激烈的并发环境下效率低下,因为所有访问 HashTable 的线程都必须竞争同一把锁
ConcurrentHashMap 使用锁分段技术,将数据分成一段一段的存储,给每一段数据配置一把锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其它线程访问
但有些方法需要跨段,如 size() 它可能需要锁定整个表而不是仅仅某个段,这需要按顺序锁定所有段,操作完毕后又按顺序锁定所有段的锁
ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成:
Segment 是一种 ReentrantLock
HashEntry 用于存储键值对数据
一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构与 HashMap 类似,是一种链表散列数据结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素
每个 Segment 维护着一个 HashEntry 数组里的元素,当要对 HashEntry 的数据进行修改时,就必须先获得对应的 Segement 锁
作者:林塬
链接:https://www.jianshu.com/p/8be1d44f92d3
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦