首页 存档 技术 查看内容

谈谈HashMap线程不安全的体现

2018-3-30 13:00 |来自: 互联网 343 0

摘要: (点击上方公众号,可快速关注) 来源:Hosee 链接:my.oschina.net/hosee/blog/673521 HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了。 那么,为什么说HashMap是线程不安全的呢? ...

(点击上方公众号,可快速关注)


来源:Hosee

链接:my.oschina.net/hosee/blog/673521


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

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部