码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程系列六——Map实现类

时间:2017-07-08 00:24:59      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:border   加锁   exce   interrupt   安全   rip   dha   row   star   

参考资料:

https://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/

https://stackoverflow.com/questions/35534906/java-hashmap-getobject-infinite-loop

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

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

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;

/**
 * @Description: 测试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<>());
        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(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 < 500000; 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 267
Test class java.util.HashMap average time 67
Test class java.util.Collections$SynchronizedMap average time 262
Test class java.util.concurrent.ConcurrentHashMap average time 167

 

Java多线程系列六——Map实现类

标签:border   加锁   exce   interrupt   安全   rip   dha   row   star   

原文地址:http://www.cnblogs.com/hiver/p/7125453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!