多线程HashMap可能存在的死循环问题
2019-11-13 本文已影响0人
dwwl
HashMap多线程情况下可能会出现的问题:
参考blog: https://my.oschina.net/xianggao/blog/393990
虽然后面的图看不懂qwq,但是自己理解比后面图简单的多
文中的代码应该是JDK8之前的代码
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry e = src[j];
if (e != null) {
src[j] = null;
do {
Entry next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}
上述代码在多线程下会出现问题的,
142929_Vawr_120166.jpg上图演示了hashMap扩容的过程(这里的reHash() 简单成 key.hashCode()对扩容后数组长度取余)
假设:两个线程同时进行扩容时,假设线程一在Entry<K,V> next = e.next;
执行后挂起,而此时线程二已经完成扩容,
第一次执行do while中的程序时,key:3的entry的next指向了key:7的entry,因为现在操作的是线程二已经扩容后的。
在假设的情况下,next已经是key:7的entry了。所以第二次执行的时候,e是key:7的entry,而经过线程二的扩容操作后,key:7的entry的next是key:3的entry,所以现在就造成了死循环