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 。
②問題,數據不一致:
③修正後