03 ConcurrentHashMap和HashMap的扩容机制

vvEcho 2024-01-20 14:08:36
Categories: Tags:

java1.7相比较java1.8,concurrentHashMap和hashMap都有一定的改动,其中concurrentHashMap在1.8版本后就不在基于Segement分段锁的实现了,并且锁的粒度改为了链表的head节点,锁的粒度更细效率更高;而hashMap在1.8版本后由于存储结构加了红黑树,以前是数组加链表,现在是数组加链表加红黑树,针对原有存储结构多线程情况下容易形成死循环链表的情况,1.8改用了尾插法避免了此情况;

hashMap扩容过程如下:

当链表节点的长度大于8,且数组的长度小于64时,对数组扩容;扩容为之前数组长度的2倍
当链表节点长度大于8,数组长度大于64时,链表转换为红黑树;
扩容的过程是,数组放在原有的索引处,链表放在原有的索引加上原有的数组长度的地方;
扩容后如果树节点小于6,就将树还原成链表;
而concurrentHashMap和hashMap扩容类似,只是对应的方法加了锁,保证了线程安全;