(1)HashMap的线程不安全原因一:死循环 原因在于HashMap在多线程情况下,执行resize()进行扩容时容易造成死循环。 扩容思路为它要创建一个大小为原来两倍的数组,保证新的容量仍为2的N次方,从而保证上述寻址方式仍然适用。扩容后将原来的数组从新插入到新的数组中。这个过程称为reHash ...
分类:
其他好文 时间:
2020-01-21 18:04:15
阅读次数:
83
1、HashMap在多线程出现的问题:hashmMap在单线程下是没有问题的,正常hashMap初始化容量是16,当当前容量用尽的时候,hashMap就会发生扩容的现象,当数组扩容后,就会发生rehash,也就是重新计算所有元素的hash值,进行重新分配。而在rehash的时候,在多线程下就容易出现 ...
分类:
其他好文 时间:
2020-01-15 09:17:45
阅读次数:
83
一、扩容的基本思路 JDK1.8中,ConcurrentHashMap最复杂的部分就是扩容/数据迁移,涉及多线程的合作和rehash。 扩容思路 Hash表的扩容包含的两个步骤: ① table数据的扩容 table数组的扩容,一般就是新建一个2倍大小的桶数组,这个过程通过一个单线程完成,且不允许出 ...
分类:
其他好文 时间:
2020-01-02 22:07:01
阅读次数:
67
在开发中,我们经常使用 HashMap 容器来存储 K V 键值对,但是在并发多线程的情况下,HashMap 容器又是不安全的, 因为在 put 元素的时候,如果触发扩容操作,也就是 rehash ,就会将原数组的内容重新 hash 到新的扩容数组中,但是在扩容这个过程中,其他线程也在进行 put ...
分类:
其他好文 时间:
2019-12-09 17:24:08
阅读次数:
88
HashMap是一个线程不安全的容器,当容量大于 发生扩容时可能会出现环形链表从而导致死循环 扩容就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示 因此引进了线程安全 ...
分类:
其他好文 时间:
2019-11-02 00:32:10
阅读次数:
97
1 HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在ge ...
分类:
其他好文 时间:
2019-10-11 00:29:09
阅读次数:
104
我们使用的HashMap一般情况的存储在1W对以上,默认的初始的table容量是16, 默认reHash每次容量翻倍,多次重构,影响性能 说明: HashMap 使用 HashMap(int initialCapacity) 初始化,正例: initialCapacity = (需要存储的元素个数 ...
分类:
其他好文 时间:
2019-09-24 15:46:12
阅读次数:
273
hashcode() 与 equals() 应一起重写,在HashMap 会先调用hash(key.hashcode()) 找到对应的entry数组位置 (一般初始是16,2^x,rehash后会翻倍),再在这个entry链表上equals判断是否存在相同元素。 所以当重写equals时没保证has ...
分类:
其他好文 时间:
2019-03-29 14:46:11
阅读次数:
153
以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同 ...
分类:
编程语言 时间:
2019-01-27 19:01:30
阅读次数:
150
以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同 ...
分类:
其他好文 时间:
2019-01-25 19:17:27
阅读次数:
167