JDK1.7 HashMap 死循环/环链/死链
JDK1.7 HashMap 源码:
transient Entry[] table;
void resize(int newCapacity) {
Entry[] oldTable = table;
int oldCapacity = oldTable.length;
if (oldCapacity == MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return;
}
Entry[] newTable = new Entry[newCapacity];
boolean oldAltHashing = useAltHashing;
useAltHashing |= sun.misc.VM.isBooted() &&
(newCapacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD);
boolean rehash = oldAltHashing ^ useAltHashing;
transfer(newTable, rehash);
table = newTable;
threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);
}
void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry e : table) {
while(null != e) {
Entry 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(oldTable)的数据分布发生多次改变造成的问题。
举例:线程1 进行扩展重新分布数据时,某个链(Entry[])分布1Entry和2Entry 。线程2改变了oldTable的数据分布。线程1再进行for遍历时,某个Entry e(for中的)中碰巧存在2Entry(因为被线程2改变了数据分布,所以能再次获取2Entry ),此时碰巧再次分布到了1Entry,2Entry所在的链,形成了2Entry,1Entry,2Entry链,造成相互引用的问题,导致后续再在此链分布数据时出现while死循环,一般在get时导致while死循环
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)