ConcurrentHashMap实现原理

从JDK1.5开始就出现了ConcurrentHashMap类用来解决HashMap非线程安全这个问题,虽然之前已经有HashTable的存在,但是因为他是使用synchronized锁住整个Hash表的,这样会带来很多性能上的不足,而ConcurrentHashMap将锁粒度细化,因此效率上相对来说更优,他的实现原理是这样的:一个ConcurrentHashMap由多个Segment组成,每一个Segment是包含了一个HashEntry数组的小HashTable,每一个Segment包含了对自己Hashtable的一组操作,比如put,get之类的,他的数据结构原理图是这样子的:

                       

        你会发现ConcurrentHashMap其实是通过Segment将大的HashTable分割成一个个的小HashTable了,这样做的目的是为了将加锁操作作用在小的HashTable上面,不至于把整个HashTable全都锁起来;

        我们来看看他的put方法是怎么执行的,首先计算出当前key值对应的hash值,找到该hash值对应的Segment位置,接下来调用的就是该位置Segment的put方法了,进入这个方法就会进行加锁操作,也就是从上面的绿色部分开始进行加锁操作,在Segment的put方法里面会传入刚刚key值的hash值,通过(tab.length - 1) & hash获得当前hash值在当前Segment对应的HashEntry数组中的位置,找到HashEntry数组的位置之后获得该位置处对应链表的第一个HashEntry值,接着就开始通过equals方法来看看该链表中是否有与当前key值equals的键值对存在了,有的话直接替换值,没有的话插入到当前链表的第一个位置,这点和HashMap是一致的,最后在put方法结束的finally中释放掉锁就可以了,这个是put过程,至于get过程和put过程原理类似,不再阐述;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值