关于ConcurrentHashMap的理解

1.7

源码:https://www.processon.com/view/link/673ef14933c4f8374860ddaa
总结:https://www.processon.com/view/link/673ef10b2b3c2547282c6d13

1.8

源码:https://www.processon.com/view/link/673ef1629b04b0770ea913c4
总结:https://www.processon.com/view/link/673ef1789b04b0770ea91409

1.7总结:

1.7中ConcurrentHashMap采用的是分段锁的思想。它是有一个segment数组,数组默认的大小是16
segment是继承自ReentrantLock的。每个segment下面相当于挂了一个hashmap,hashmap是基于
数组+ 链表实现的。

放入元素的时候,会先根据key计算出一个hash值,然后根据hash值计算出segment的位置,
如果对应的位置有segment对象,直接调用segment对象的put方法,放入元素;
如果对应的位置没有segment对象,会创建一个新的segment对象,然后将新生成的segment对象放入
segment数组中;
放入的时候会使用while循环一直判断对应的位置是否已经有了segment对象,没有的话,才使用cas操作
设置对应的位置的值;

segment对象放入之后,会调用它的put方法,存放元素;

put方法里面会先通过trylock尝试获取锁,如果获取不到,还会通过一个方法,不断的尝试获取锁,
直到达到最大重试次数;达到最大尝试次数之后,直接调用lock方法获得锁;

获得锁之后,放入元素的过程和hahsmap一样。也是通过key计算hash值,然后计算要存放的位置,也是
通过hash值和数组的长度-1进行与操作得到要存放的位置;

如果当前位置没有元素,则直接放入;如果有元素,则遍历链表,找有没有key相同的元素,有的话,直接设置
value值;如果没有找到key相同的元素,通过头插法将元素插入;

如果元素的个数达到了扩容阈值,就会进行扩容操作,扩容是按老数组容量2倍进行扩容,会重新计算元素的hash值
然后搬运元素、

1.8总结:

1.8中的ConcurrentHashMap使用的是数组 + 链表 + 红黑树实现的

底层的数组存储的是Node节点,如果是红黑树的话,对应的节点类型是Treebin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值