ConcurrentHashMap同时进行PUT / GET的问题

时间:2019-05-16 17:31:08

标签: java multithreading collections hashmap concurrenthashmap

我正在实现一个类似缓存的应用程序,该应用程序使用NavigableMap数据结构来缓存20种不同用户名的文本数据(几百个JSON字符串)(目前只有两个,最终会扩展到大约20个用户名)。我有7种时间序列缓存/ NavigableMaps,用于7种不同类型,每种用户名每30分钟刷新一次。然后在服务器线程中,给定类型,时间范围和用户名,我访问相应的NavigableMap

当我只有一个用户名时,我分别拥有7个NavigableMap <Long, String>,而且都很完美。但是为了处理更多用户,我创建了一个父级静态ConcurrentHashMap,每个键(即用户名)映射到其自己的NavigableMap,每个缓存都在单独的线程(即20个线程)中完成。全部加到父级HashMap中。

在添加另一个NavigableMap数据后,该数据比其他类型的数据更多,并且检索率更高,我 有时 一些奇怪的退休(获取)< / strong>问题,甚至有时ConcurrentHashMap都不用put更新。我的猜测是它无法从ConcurrentHashMap检索数据。

出什么问题了?单个ConcurrentHashMap数据结构是否对快速检索造成任何问题?其次,同时 PUT 两个不同的键,是否会引起任何问题?

主要定义如下:

public class MyCache {
        static ConcurrentHashMap<String, NavigableMap <Long, String>> map1= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
        static ConcurrentHashMap<String, NavigableMap <Long, String>> map2= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
        static ConcurrentHashMap<String, NavigableMap <Long, String>> map3= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
        static ConcurrentHashMap<String, NavigableMap <Long, String>> map4= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
        static ConcurrentHashMap<String, NavigableMap <Long, String>> map5= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
        static ConcurrentHashMap<String, NavigableMap <Long, String>> map6= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();
        static ConcurrentHashMap<String, NavigableMap <Long, String>> map7= new ConcurrentHashMap<String, NavigableMap <Long, String>> ();

        public static void main(String[] args) throws Exception {
    new Server(); //new server thread accessing caches
    for (int i =0 ; i< users.length; i++) //cache data for each username
         new Caching();
    }
}

这里有一个示例PUT可以同时发生:

MyCache.map1.put(username, new ConcurrentSkipListMap <Long, String> (map1Temp));

这是访问/ GET部分:

    //...
    switch (type) {
            case "type1":
                list = new ArrayList<String>(MyCache.map1.get(username).subMap(start, end).values());
                break;

            case "type2":
                list = new ArrayList<String>(MyCache.map2.get(username).subMap(start, end).values());
                break;
    // ...
            case "type7":
                list = new ArrayList<String>(MyCache.map7.get(username).subMap(start, end).values());
                break;
//and send the array as text over HTTP

0 个答案:

没有答案