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多线程不安全问题总结的主要内容,如果未能解决你的问题,请参考以下文章