HaspMap 多线程下 resize 死循环
2013-12-26 17:00
204 查看
HashMap在多线程下面出现死循环,这种情况有点难模拟,千万别在生成环境出现,一旦出现那就等着哭吧。
废话不多说不知道hashmap 如何扩容的先看下源码可能好理解点。
在多线程情况下,情况就不一样了。模拟一种情况:
假设现在HashMap 的table 长度为2 ,因子为1 如下图
现有线程P1 、P2
当P1线程执行到 过程(1)下面的时候
此时 e =a1 ,next = a2 P2 进入执行了并且执行完毕
当前新的结构为
再执行P1 此时得到的新数组索引和P2 是一样。
e.next =newTable[i] 即为 a2 (a2.next =a1)
newTable[i] = e 即为 a1 数组结构变为
e=next 即为 a2 ;
第二次循环的时候
Entry<K, V> next = e.next 即为a1
e.next = newTable[i]; 即为 a1 (a1.next = a2)
newTable[i] = e 即为 a2 数据结构变为
e=next 即为 a1 ;
第三次的循环的时候
Entry<K, V> next = e.next 即为a2
就形成了回环了。
就成了死循环。
在多线程循环下不要使用hashmap 。
废话不多说不知道hashmap 如何扩容的先看下源码可能好理解点。
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); table = newTable; threshold = (int) (newCapacity * loadFactor); }
//此方法就是 hashMap 将数据放到新的扩容之后的数组,方法没啥问题,完全正确无误。 void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; for (int j = 0; j < src.length; j++) { Entry<K, V> e = src[j]; if (e != null) { src[j] = null; do { //过程(1) Entry<K, V> next = e.next; int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } while (e != null); } } }
在多线程情况下,情况就不一样了。模拟一种情况:
假设现在HashMap 的table 长度为2 ,因子为1 如下图
现有线程P1 、P2
当P1线程执行到 过程(1)下面的时候
此时 e =a1 ,next = a2 P2 进入执行了并且执行完毕
当前新的结构为
再执行P1 此时得到的新数组索引和P2 是一样。
e.next =newTable[i] 即为 a2 (a2.next =a1)
newTable[i] = e 即为 a1 数组结构变为
e=next 即为 a2 ;
第二次循环的时候
Entry<K, V> next = e.next 即为a1
e.next = newTable[i]; 即为 a1 (a1.next = a2)
newTable[i] = e 即为 a2 数据结构变为
e=next 即为 a1 ;
第三次的循环的时候
Entry<K, V> next = e.next 即为a2
就形成了回环了。
就成了死循环。
在多线程循环下不要使用hashmap 。
相关文章推荐
- Linux下,多线程程序死循环问题调试
- 使用多线程手动写出循环打印ABABABAB...
- Java多线程:用三个线程控制循环输出10次ABC
- HashMap多线程调用下的死循环问题
- 关于HaspMap存放顺序的解决问题
- Java多线程 循环打印ABC 10次
- HashMap多线程死循环问题
- 在多线程应用程序中使用循环缓冲区高效地进行日志记录
- HashMap多线程下发生死循环的原因
- Java HashMap多线程下为什么会死循环?
- 一个多线程死锁的问题,一个循环引用的问题
- Java多线程:用三个线程控制循环输出10次ABC
- Restrict the resize the height of QWizard page which has watermark picture
- 并行编程之多线程共享非volatile变量,会不会可能导致线程while死循环
- Linux 多线程调试(内存占用、死循环、CPU占用率高……)
- haspMap的遍历
- for循环中多线程的无序性
- C# 多线程、控制线程数提高循环输出效率
- Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc
- 多线程面试题:子线程循环10次,接着主线程循环100次;接着回到子线程循环10次,然后再回到主线程循环100次,如此交替50次。