网上一直说,HashMap是非线程安全性,但是一直没有测试来证明会产生什么样的问题。
所以自己写了段测试代码。
以下是测试代码
@Service public class TestService { final static Logger log = LoggerFactory.getLogger(TestService.class); final static Map<String,String> testmap = new HashMap<>(); final static Map<String,String> testconmap = new ConcurrentHashMap<>(); @PostConstruct public void init(){ log.debug("This is a debug message"); log.info("This is an info message"); log.warn("This is a warn message"); log.error("This is an error message"); ceshiHashMap(); } /** * 测试非线程安全 */ public void ceshiHashMap(){ Integer threadCount =10; CountDownLatch countDownLatch = new CountDownLatch(threadCount); // 启动threadCount个子线程 for(int i = 0; i < threadCount; i++) { Thread thread = new Thread(new MyThread(countDownLatch)); thread.start(); } try { countDownLatch.await(); for(int i=0;i<100;i++){ System.out.println(testmap.get(String.valueOf(i))); } }catch (InterruptedException ex){ System.out.println(ex); } } class MyThread implements Runnable{ private CountDownLatch countDownLatch; public MyThread(CountDownLatch countlatch){ this.countDownLatch=countlatch; } @Override public void run() { for(int i=0;i<100;i++){ testmap.put(String.valueOf(i), String.valueOf(i)); if(i==2){ testmap.put(String.valueOf(2),String.valueOf(2)); }else if(i==20){ testmap.put(String.valueOf(2),String.valueOf(20)); }else if(i==26){ testmap.put(String.valueOf(2),String.valueOf(26)); } } System.out.println(testmap.get(String.valueOf(2))); countDownLatch.countDown(); } }
}这是运行结果可以看到有一次取到的。