HashMap多线程不安全问题总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap多线程不安全问题总结相关的知识,希望对你有一定的参考价值。

参考技术A     1、HashMap的底层数据结构是数组+链表的结构。在插入数据的时候,会先计算数据的hashcode值,再取余放入数组对应下标处。如果发生hash碰撞,则插入当前node的后面,形成一个链表的结构。

2、数组的默认大小是16,默认的扩容因子是0.75,每次达到阈值( size * 0.75)的时候,就会对数组进行扩容,扩容每次都是在现有基础上扩容2倍。

3、在数组长度大于64,并且链表长度大于8的时候,链表会转成红黑树,之所以是需要数组长度大于64,是因为优先要扩容数组大小,减少hash碰撞的次数,提高性能。在红黑树小于7的时候,会转成链表,之所以是要小于7,是避免红黑树和链表之间的频繁转换。

了解到了HashMap的主要特点,再来看HashMap的线程不安全问题:

         在线程A、B put的数据发生hash碰撞并且数组里面已经有数据的情况下,两个线程同时获得头结点的next指针,next指针只能指向一条数据,比如有另外一条数据丢失。

        在数组扩容的时候,会new一个新的数组出来,再遍历旧的数组,如果从旧数组里面取出来的值非null,会将这个值取出来放到新数组里面,并将旧数组里面的值置为null,而这个时候,旧数组还没有遍历完全,另外一个线程get数据的时候可能获取到的时候就是null。

多线程下的HashMap竟然绕环了

导读:早就听说过HashMap不是线程安全的,在多线程情况下可能会出问题,自己一直是一知半解,正好五一有时间就抽时间来研究一下。

关键词:线程安全,HashMap

 

 

 

 

 

直接上图

技术图片

技术图片

 

 

 技术图片

 

 

 技术图片

技术图片

 

 技术图片

技术图片

技术图片

 

总结

看过的知识点不一定属于自己,但是推敲过得就一定属于自己了(题外话,推敲这个过程花了个把小时,但是画这个图却是花了我大半天时间)。

以上是关于HashMap多线程不安全问题总结的主要内容,如果未能解决你的问题,请参考以下文章

Java并发多线程编程——集合类线程不安全之HashMap的示例及解决方案

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

都说知道 HashMap 线程不安全,那它为啥就不安全?

HashMap为什么线程不安全?

HashMap线程不安全的体现

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