缓存并发查询

时间:2015-11-07 16:01:37

标签: java caching concurrency

我有一个基于ConcurrentHashMap的缓存类。此缓存用于存储从相对较慢的参考数据服务获得的结果。

这样做的一个问题是,当多个线程尝试获取不存在的密钥时,两个线程都将从参考数据服务获取相同的密钥,从而导致两个参考数据调用。

我正在考虑改进缓存的实现,以便只有一个线程查询引用数据服务。

这是否有任何标准实施?

1 个答案:

答案 0 :(得分:0)

以下是将唯一键存储在List<>中的示例代码。 keyLocks,如果传递了具有等效值的对象,它将返回相同的键,然后键上的同步块

private final List<Object> keyLocks = new ArrayList<>(); // field in Cache




   public Object get(Object key){
      Object lock;
      synchronized (keyLocks) {
        if (!keyLocks.contains(key)) {
           keyLocks.add(key);
           lock = key;
        } else {
           lock = keyLocks.get(keyLocks.indexOf(key));
        }
      }
      synchronized (lock) {
         if(innerCache.containsKey(key)){
            return cache.get(key);
         }else{
            Object result = dataService.get(key);
            innerCache.put(key,result);
            return result;
         }
      }
   }