大厂面试爱问的HashMap死锁问题,看这一篇就够了
经历过大厂面试或者有所了解的同学都应该知道,HashMap是面试时面试官特别喜欢的问题,除了HashMap的扩容方式,为什么扩容的2的次幂等以外,还经常会问到HashMap死锁的相关问题。最常出现的死锁问题的是在JDK 1.7版本,为了理解死锁问题产生的原因我们来从源码和一些相关概念开始说起。
JDK 1.7 HashMap源码分析
put()方法
public V put(K key, V value) {
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
if (key == null)
return putForNullKey(value);
int hash = hash(key);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
put()方法可以总结成以下四个过程:
-
特殊 key 值处理,key 为 null;(在JDK 1.7版本 key可以为null,如果是第一次put会被用头插法存在bucket[0]的位置,在JDK1.8以后则会直接报异常)
-
计算 table 中目标 bucket 的下标;
int i = indexFor(hash, table.length); indexFor的源码如下: /** * Returns index for hash code h. */static int