HashMap并发出现死循环 及 减少锁的竞争

Posted 哦克Oak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap并发出现死循环 及 减少锁的竞争相关的知识,希望对你有一定的参考价值。

常见的一个问题:

线程不安全的HashMap, HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,查找时会陷入死循环。

 

常量概念:

 默认初始化大小为16,之后每次扩充,容量变为原来的2倍

 默认加载因子为0.75

 

 modCount作用:

  迭代器每修改一次就 +1 

  HashMap 不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略

 

Java8对hashmap的改进:

扰动函数: 

 

 

 

HashMap的底层是哈希数组,数组元素为Entry。HashMap通过key的hashCode来计算hash值,当hashCode相同时,通过“拉链法”解决冲突

 

jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。原本Map.Entry接口的实现类Entry改名为了Node。转化为红黑树时改用另一种实现TreeNode。 

 

 

 

 

 

以上是关于HashMap并发出现死循环 及 减少锁的竞争的主要内容,如果未能解决你的问题,请参考以下文章

关于并发

HashMap为什么是线程不安全的?

HashMap并发下死循环问题解析

图解集合5:不正确地使用HashMap引发死循环及元素丢失

图解集合 5 :不正确地使用 HashMap 引发死循环及元素丢失

为什么 HashMap 并发时会引起死循环?