原因:
其本质原因是因为它不支持线程安全
更深入的原因就是它在多线程环境下会形成循环链表
hashmap在jdk1.6的时候底层数据结构是数组加链表(entry)
在多线程环境下会导致hashmap的entry链表线程环形数据结构,那么entry的节点就会永远不为空,就会线程循环链表,就是死循环
hsahmap在jdk1.8的时候底层数据结构是数组,链表,红黑树,在多线程环境下会形成环行结构,产生死循环的问题
我们来用代码模拟一下
package com.concurrent;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author 邓亚非
*/
public class TestHashMapThread extends Thread{
private Map<Integer,Integer> map=new HashMap<>();
//创建一个原子类
private AtomicInteger atomicInteger=new AtomicInteger();
@Override
public void run() {
while (atomicInteger.get()<1000000000){
map.put(atomicInteger.get(),atomicInteger.get());
atomicInteger.incrementAndGet();
}
}
public static void main(String[] args) {
for (int i = 0; i <10 ; i++) {
Thread thread=new TestHashMapThread();
thread.start();
}
/**
* 循环模拟高并发的方式,向hashmap集合添加元素产生的问题
*/
}
}
这是随机产生的,而且对电脑cpu非常不好,搞不好会造成我的电脑卡住,所以我就不多模拟了