jdk 1.7 和 jdk1.8 对比 hashMap 、concurrentHashMap
2021-03-31 16:03:40 0 举报
jdk 1.7 和 jdk1.8 对比 hashMap 、concurrentHashMap
作者其他创作
大纲/内容
jdk 1.7 和 jdk1.8 对比 hashMap 、concurrentHashMap
put方法
put线程
处理完成数据后释放锁
1、判断当前数组是否需要初始化2、如果key为空,则put进去一个空值进去3、根据key计算一个hashCode4、根据hashCode 定位出一个所在桶5、如果桶是一个链表则需要遍历判断里面的hashCode,key是否和传入的key相等,如果相等则进行覆盖,并返回原来的值6、如果桶是空的,则说明当前位置没有数据存入,新增一个entry对象写入当前的位置
1、计算key 的hashCode 定位桶,为空则返回null2、桶不为空,则判断桶的第一个元素key是否相同,相同则返回value3、如果key不同,则判断下一个是红黑树还是链表4、根据桶的类型查找红黑树或遍历链表找到key相等的数据返回,如果没有找到,则返回null
数据结构:数组+单向链表(链表长度大于8后转红黑树)
ConcurrentHashMap
抛弃了原有的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。优化了synchronized
是
成功,put
成功
1、计算hashCode 定位桶,桶为空 返回null2、判断是否链表3、链表的话,遍历,直到key 和 hashCode 都相等返回值4、非链表的话,如果key和hashCode都相等,则返回值
阻塞锁 lock()
失败
retries<= MAX_SCAN_RETRIES
同一个Segment上
优化:提高链表遍历效率
get
否
jdk1.7 jdk1.8
hashMap
= MAX_SCAN_RETRIES
自旋获取锁 tryLock()
数据结构:数组+单向链表
0 条评论
下一页