最近在学Hash Map的底层,但出现了一些盲点。就是在jdk1.7中,当需要扩容时,源码是这样写的
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]; transfer(newTable, initHashSeedAsNeeded(newCapacity)); table = newTable; threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1); }关于这里的
Entry[] newTable = new Entry[newCapacity];我想知道,在jdk1.7构成循环链表的那种情况下,是每一个线程都会new一块新的Entry数组,还是说所有的线程共享一块Entry数组?
除此之外,有没有情况说是,不同的线程都开辟了一块新的Entry数组,最后写回给table的是最后执行完的哪个线程呢?
还请大佬们帮我解决一下疑惑
全部评论
(5) 回帖