多线程 put hashmap操作,出现死循环
多线程 在put hashap的时候,如果map容量>初始容量*负载因子的时候
会触发rehash操作(扩容),改变了hashmap的结构,如果多个线程
同时触发了rehash 就可能产生闭合回路
resize操作->
新建hashtable->将oldhashtable上的数据迁移到新的
hashtable上
transfer操作->
void transfer(Entry[] newTable)
{
Entry[] src = table;
int newCapacity = newTable.length;
//下面这段代码的意思是:
// 从OldTable里摘一个元素出来,然后放到NewTable中
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
这个for循环如果两个线程同时在调用,就可能会出现一个循环链表,这个时候,如果我们去get map中的元素可能就会出现死循环
贴一篇文章:
http://hongjiang.info/tag/collection/,可以看看