想必大家通过各种渠道都已经知道了HashMap是线程不安全的,当然HashMap的线程不安全表现在很多方面,今天我们主要是彻底弄清楚HashMap在多线程下造成死锁的原因。
阅读HashMap源码的时候我们知道,HashMap在扩容的时候会调用transfer函数。就是将原Hash表上的元素全部转移到新的hash表上,我们将transfer的函数再次贴出来:
void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry<K,V> e : table) {
while(null != e) {
Entry<K,V> 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;
}
}
}
rehash的过程就是将旧表中的entry全部转移到新表中,每次都是采用头插法。