记录Java7多线程下Hashmap扩容可能成环的代码分析
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; } } }
table[2] 中元素(a(2)-b(10))
for (Entry<K,V> e : table) 遍历
1:
e = 2, next = e.next = 10
int i = 2
e.next = newTable[i] = null
newTable[i] = 2;
e = next = 10;
当此时另一个线程已经执行完 table = newTable;
此时table中 table[2] (b(10)-a(2))
2:
e = 10, next = e.next = 2
int i = 2
e.next = newTable[i] = 2
newTable[i] = e = 10;
e = next = 2;
此时,newTable[2] 为 b(10) - a(2)
3:
e = 2, next = e.next = null
int i = 2
e.next = newTable[i] = 10(其中next=2)
newTable[i] = e = 2;(此时链表正式形成,当进行查询或新增时,会无限循环)
e = next = null
table[2] entry = a(2),next = b(10),next = a(2)...成环