扫码关注微信公众号
回复“面试手册”,获取本站PDF版
回复“简历”,获取高质量简历模板
回复“加群”,加入程序员交流群
回复“电子书”,获取程序员类电子书
- 实现结构上的不同,JDK1.7是基于Segment实现的,JDK1.8是基于Node数组+链表/红黑树实现的。
- 保证线程安全方面:JDK1.7采用了分段锁的机制,当一个线程占用锁时,会锁住一个Segment对象,不会影响其他Segment对象。JDK1.8则是采用了CAS和
synchronize
的方式来保证线程安全。 - 在存取数据方面:
- JDK1.7中的
put()
方法:- 先计算出
key
的hash
值,利用hash
值对segment数组取余找到对应的segment对象。 - 尝试获取锁,失败则自旋直至成功,获取到锁,通过计算的
hash
值对hashentry数组进行取余,找到对应的entry对象。 - 遍历链表,查找对应的
key
值,如果找到则将旧的value直接覆盖,如果没有找到,则添加到链表中。(JDK1.7是插入到链表头部,JDK1.8是插入到链表尾部,这里可以思考一下为什么这样)
- 先计算出
- JDK1.8中的
put()
方法:- 计算
key
值的hash
值,找到对应的Node
,如果当前位置为空则可以直接写入数据。 - 利用CAS尝试写入,如果失败则自旋直至成功,如果都不满足,则利用
synchronized
锁写入数据。
- 计算
- JDK1.7中的
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版