Как гибрид ConcurrentHashMap и ConcurrentLinkedQueue.
Вот мои требования:
Мне нужна асинхронная обновляемая система кэширования. Это означает, что я оборачиваю каждый объект, прежде чем помещать его в кэш памяти. В варпере есть метка времени, которая указывает, когда истечет срок его содержимого. Каждый запрос с внешней стороны будет извлекать данные из кэша памяти, и если варппер показывает срок действия, будет сгенерировано событие обновления, которое будет помещено в concurrentLinkedQueue, а затем будет ожидать асинхронного обновления.
Проблема в том, что я не хочу обновлять объект более одного раза напрасно. Прежде чем добавлять событие в очередь, я хочу найти способ убедиться, что в очереди уже нет события для того же объекта.
Это нормально, если я сделаю это таким образом?
1. Создайте класс warpper, он содержит хэш-карту и связанный список. Весь его метод синхронизирован:
public synchronized boolean add(String key,Object value){
if(hashMap.containsKey(key)){
return false;
}else{
hashMap.put(key,value);
return linkedList.offer(value);
}
}
Я считаю, что это решение будет очень медленным.
Возможно, это похоже на Collections.synchronizedMap(new LinkedHashMap()).
2. Просто используйте concurrentHashMap. Если мне нужно действие «опрос», итератор элемента из него.
public Object poll(){
Collection valueColl = concurrentHashMap.values();
if(valueColl.isEmpty()){
retrun null;
}
return valueColl.get(0);
}
Действие concurrentHashMap.values().get(0)
медленное или нет?
3. Просмотрите исходный код "ConcurrentHashMap" и "ConcurrentLinkedQueue", а затем, если возможно, напишите "ConcurrentUniqueLinkedQueue".
На данный момент это выглядит немного сложно для меня.
Итак, как бы вы сказали, ребята?
add
довольно быстрые. Также я думаю, что это довольно чистое решение. Но я бы заменил hashMap на hashSet, потому что на самом деле здесь нет hashMap. - person Mikita Belahlazau   schedule 01.02.2013