【Java】HashMap线程不安全测试、及解决

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 。
②问题,数据不一致:
在这里插入图片描述
③修正后

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章