package com.test;
import lombok.extern.slf4j.Slf4j;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import org.junit.Test;
@Slf4j(topic = "c.TestHashMap")
public class TestHashMap {
@Test
public static void main(String args[]) throws InterruptedException {
Map<Integer,Integer> map = new HashMap<Integer, Integer>(); //则≤10W:
//修正
//Map<Integer,Integer> map = Collections.synchronizedMap(new HashMap<Integer, Integer>()); //则=10W
//修改
//Map<Integer,Integer> map = new ConcurrentHashMap<Integer, Integer>(); //则=10W
//JDK 1.7测试
/* final Map<Integer,Integer> map = new HashMap(); Thread t1=new Thread(new Runnable(){ @Override public void run() { for (int i = 0; i < 50000; i++) { map.put(new Integer(i), i); } } }); Thread t2=new Thread(new Runnable(){ @Override public void run() { for (int i = 50000; i < 100000; i++) { map.put(new Integer(i), i); } } }); t1.start(); t2.start(); //多刷新几次则会出现死循环 */
//JDK 1.8测试
new Thread(()->{
for (int i = 0; i < 50000; i++) {
map.put(new Integer(i), i);
}
},"t1").start();
new Thread(()->{
for (int i = 50000; i <100000; i++) {
map.put(new Integer(i), i);
}
},"t2").start();
Thread.sleep(1000);
System.out.println(map.size());
}
}
①问题,死循环:CPU占据100%
正常下:
异常下:
jdk 1.8 后解决了这个问题,但是还是不建议在多线程下使用 HashMap,因为多线程下使用 HashMap 还是会存在其他问题比如数据丢失。并发环境下推荐使用 ConcurrentHashMap 。
②问题,数据不一致:
③修正后