zoukankan      html  css  js  c++  java
  • 【Java多线程系列六】Map实现类

    Map的一些实现类有及其特性

    线程安全 特性

    Hashtable

    Key不能为null

    HashMap

    读写效率最高,但在Java6多线程环境下使用不当可能陷入死循环,进而导致CPU使用率过高(原理可参见:http://coolshell.cn/articles/9606.html)

    Collections.synchronizedMap

    Collections.SynchronizedMap在Map所有方法基础上加锁,效率与HashTable相当

    ConcurrentHashMap

    采用分段锁,get一般不加锁,put分段锁,key/value不能为null,效率仅次于HashMap

    以下代码测试各类的读写效率:

    package com.concurrent.test;
    
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Map;
    import java.util.concurrent.ConcurrentHashMap;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    /**
     *  测试map
     */
    public class ThreadMapTest {
    
        public static void main(String[] args) throws InterruptedException {
             Map<Integer, Integer> hashtable = new Hashtable<>();
             Map<Integer, Integer> hashmap = new HashMap<>();
             Map<Integer, Integer> synchronizedHashMap = Collections.synchronizedMap(new HashMap<Integer, Integer>());
             Map<Integer, Integer> concurrentHashMap = new ConcurrentHashMap<>();
    
             test(hashtable);
             test(hashmap);
             test(synchronizedHashMap);
             test(concurrentHashMap);
        }
        
        
        private static void test(Map<Integer, Integer> map) throws InterruptedException {
            int testTimes = 5;
            long totalTimeMillis = 0;
            for (int k = 0; k < testTimes; k++) {
                totalTimeMillis += costTimeMillis(map);
            }
            System.out.println("Test " + map.getClass() + " average time " + (totalTimeMillis / testTimes));
        }
        
        private static long costTimeMillis(final Map<Integer, Integer> map) throws InterruptedException {
            int count = 5;
            ExecutorService executorService = Executors.newFixedThreadPool(count);
            long startMillis = System.currentTimeMillis();
            for (int i = 0; i < count; i++) {
                executorService.execute(new Runnable() {
    
                    @Override
                    public void run() {
                        for (int j = 0; j < 50000; j++) {
                            map.put(0, 0);
                            map.get(0);
                        }
                    }
                });
    
            }
            executorService.shutdown();
            executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
            return System.currentTimeMillis() - startMillis;
        }
        
        
    }

    输出结果如下:

    Test class java.util.Hashtable average time 104
    Test class java.util.HashMap average time 31
    Test class java.util.Collections$SynchronizedMap average time 79
    Test class java.util.concurrent.ConcurrentHashMap average time 66
  • 相关阅读:
    Django框架简介
    前端之Bootstrap
    前端之JQuery
    前端之BOM和DOM
    前端知识之js
    前端知识之CSS
    假期学习总结2-10
    假期学习总结2-9
    假期学习总结2-8
    假期学习总结2-7
  • 原文地址:https://www.cnblogs.com/zhaoyibing/p/9628103.html
Copyright © 2011-2022 走看看