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,所以現在就造成了死循環