【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 。
②問題,數據不一致:
在這裏插入圖片描述
③修正後

在這裏插入圖片描述

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