问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

hashmap是线程安全的吗

发布网友 发布时间:2022-04-25 15:30

我来回答

1个回答

热心网友 时间:2023-10-13 00:52

首页
所有文章
资讯
Web
架构
基础技术
书籍
教程
Java小组
工具资源

谈谈HashMap线程不安全的体现
2016/10/18 | 分类: 基础技术 | 6 条评论 | 标签: HASHMAP, 并发
分享到:26
原文出处: Hosee
HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了。
那么,为什么说HashMap是线程不安全的呢?它在多线程环境下,会发生什么情况呢?
1. resize死循环
我们都知道HashMap初始容量大小为16,一般来说,当有数据要插入时,都会检查容量有没有超过设定的thredhold,如果超过,需要增大Hash表的尺寸,但是这样一来,整个Hash表里的元素都需要被重算一遍。这叫rehash,这个成本相当的大。

void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}

Entry[] newTable = new Entry[newCapacity];
transfer(newTable, initHashSeedAsNeeded(newCapacity));
table = newTable;
threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
}

void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry e : table) {
while(null != e) {
Entry next = e.next;
if (rehash) {
e.hash = null == e.key ? 0 : hash(e.key);
}
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
}
}
}

大概看下transfer:
对索引数组中的元素遍历
对链表上的每一个节点遍历:用 next 取得要转移那个元素的下一个,将 e 转移到新 Hash 表的头部,使用头插法插入节点。
循环2,直到链表节点全部转移
循环1,直到所有索引数组全部转移
经过这几步,我们会发现转移的时候是逆序的。假如转移前链表顺序是1->2->3,那么转移后就会变成3->2->1。这时候就有点头绪了,死锁问题不就是因为1->2的同时2->1造成的吗?所以,HashMap 的死锁问题就出在这个transfer()函数上。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
领组词有哪些词语有 推荐点自己个人认为不错的 简洁点的手机铃声 还有短信音 重点是... 我这个配置能带动GTX760吗 请问我的电脑配置 是配GTX660还是GTX760 电源室安钛克 VP450P_百 ... 请问我这样的配置能带起GTX760不 我现在电脑想加显卡,目前看中GTX760,我这样的配置能配这显卡吗? 以下配置能上GTX760显卡吗 为什么四氧化三铁标不出化合价 ...下铅丹(用X表示)与硝酸能发生反应:X+4HNO3═PbO2+2 四氧化三铁(Fe 3 O 4 )中铁元素的化合价有+2和+3价,其化学式可改写为F... 杨姓女孩取名带舒字 有没有人懂霍山石斛的真假鉴别方法 hashmap为什么是线程不安全的 hashmap哪个线程不安全 铁皮枫斗泡的茶为什么一点味道都没有呢这个是不是算好 姓夏女孩起名字,带有一个舒字的,可爱一点、个性一点 为什么HashMap是线程不安全的 姓舒的女孩取个单字名,叫什么好听呢? hashmap为什么不是线程安全的 姓卢,女生,取三个字,带一个舒字,可以怎么取? 铁皮石斛枫斗什么味道 女孩子取名字有个“舒”字好吗 姓舒的女孩取名字,要求十三画或者十六画的字。 姓舒女孩取名字大全2014属马 铁皮石斛的花泡水是什么味道 霍斛为什么有苦味? WPS表格中怎么用EVALUATE计算多个式子 请问wps表格如图的“跨工作表取数”,对应什么函数啊??每次都手动输入,效率很低? 2013wps表格evaluate不能用 如何把evaluate函数添加到excel 为什么hashmap线程不安全 2015年阳历8月7号8时29分姓舒的女孩起什么名字好听 HashMap为什么线程不安全 女孩起名字姓吴中间想带个舒字的名字 取名 姓舒,最后一个字寒,是个女孩中间加什么字好?舒(?)寒 hashmap 为什么是线程不安全 女孩用舒或诗取名字 hashmap 为什么线程不安全 求中间带舒字的女孩,男孩名字 hashmap 是线程安全的吗 hashmap是线程安全的吗,为什么不是线程安全的 女孩姓张求取比较现代气质的名字,最好带《舒》字的,感谢高人啦! 2010年农历3月份出生的女孩姓宋中间舒字,取什么名字好 concurrenthashmap线程安全吗 hashmap是线程不安全的但是为什么用的多一些 实现原理,如何保证HashMap的线程安全 蒸枣馒头的做法家常做法 HashMap为什么哪里不安全? 怎样蒸大枣馒头 hashMap,hashTable哪个具有线程安全性