我有一个基于ConcurrentHashMap的缓存类。此缓存用于存储从相对较慢的参考数据服务获得的结果。
这样做的一个问题是,当多个线程尝试获取不存在的密钥时,两个线程都将从参考数据服务获取相同的密钥,从而导致两个参考数据调用。
我正在考虑改进缓存的实现,以便只有一个线程查询引用数据服务。
这是否有任何标准实施?
答案 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;
}
}
}