校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > java语言 > HashMap、Hashtable、concurrentthashmap
题目

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

解答

HashMap的结构:

HashMap的结构就是哈希表,底层是一个数组,这个数组中尽可能地分散所有的key,通过key的hash值得到数组下标,然后把entry插到该数组,假如有两个不同的key被分到相同的下标,也就是哈希冲突,那么该数组在该下标下就会形成链表。

为了减少冲突,我们需要时刻留意当前的size是否太大,检查是否需要扩容,一旦超过设定的threshold,那么就要重新增大数组尺寸,此时所有元素都需要重新计算应该放置的下标。

扩容、rehash
上面为扩容的方法,可以看到,实际上扩容就是新建了一个数组,同时调用了transfer方法,给新数组赋值后覆盖掉原来的table

在transfer方法中,对原来的table进行遍历重排序,我们来模拟一下这个过程。重新排序的关键在于,数组长度变了以后,重新计算得出的下标,这与哈希算法有关,为了便于理解,我们简单地认为本HashMap的哈希算法为用key 去mod数组的长度,这也是理解transfer如何重新排列链表的关键。

假设有两个进程同时进行put操作,且让HashMap进行扩容,同时进入transfer方法, 有可能形成循环链表。

C 0条回复 评论

帖子还没人回复快来抢沙发