问五:说说ConcurrentHashMap吧?

引入:如何优化Hashtable?

通过锁细粒度化,将整个锁拆解成多个锁进行优化

 

这儿就引入了早期的ConcurrentHashMap

使用的是分段锁技术,把Bucket分成几段来存储,为每一段数据都配一把锁(segment)【这样做的原因是:为每个Bucket都添加一把锁的话,资源消耗大,比如1w个Bucket就要有1w个锁

当某个程序访问某个数据段的时候,就会获得当前数据段(segment)的锁,操作其子数组。而如果还有程序要访问,就只能被阻塞,而其他未被访问到的数据段依旧可以访问

早期ConcurrentHashMap分配了16个segment,理论上较Hashtable会提高16倍的效率

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

Segment是一个可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。

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

 

这儿就引入了现如今的ConcurrentHashMap,通过CAS和synchronized使锁进一步细化,结构和JDK1.8的HashMap相同

附:HashMap是在package java.util包下的,但是ConcurrentHashMap是在package java.util.concurrent下的

 

concurrent分段如何实现的?具体一点

 

 

源码分析:

里面有很多参数和HashMap相同

也有独特的参数,比如这个控制table大小的变量

进入到源码中,直接看put方法,发现里面一开始就有个对key、value判空的条件:

也就是说ConcurrentHashMap是不能够存放空值的,而HashMap则可以。

然后下一行,能够看到ConcurrentHashMap对hash值的确定:

由于对数组更新是使用CAS来进行更新的,所以需要不断去做失败重试,直到成功为止

如果发生了hash碰撞,ConcurrentHashMap的处理逻辑:

 

ConcurrentHashMap:put方法的逻辑

1.判断Node[]数组是否初始化,没有就进行初始化操作

2.通过hash定位数组的索引坐标,是否有Node节点,如果没有就使用CAS进行添加(链表的头结点),添加失败则进入下一次循环

3.如果检查到内部正在扩容,就帮助它一块扩容

4.如果f!=null,则使用synchronized锁住f元素(f元素就是链表或者红黑二叉树的头元素)

    4.1 如果是Node,则执行链表的添加方法

    4.2 如果是TreeNode,则执行树添加结构

5.判断链表长度是否已经达到临界值88是默认值,可以调整),当节点数超过这个值,就需要把链表转化为树结构

 

ConcurrentHashMap的总结:比起Segment,锁拆的更细

1.首先使用无锁操作CAS插入头结点,失败则循环重试

2.若头结点已经存在,则尝试获取头结点的同步锁,再进行操作

全部评论

相关推荐

02-08 20:56
已编辑
南京工业大学 Java
在等offer的比尔很洒脱:我也是在实习,项目先不说,感觉有点点小熟悉,但是我有点疑问,这第一个实习,公司真的让实习生去部署搭建和引入mq之类的吗,是不是有点过于信任了,我实习过的两个公司都是人家正式早搭好了,根本摸不到部署搭建的
点赞 评论 收藏
分享
hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务