Как насчет этого SingletonCache класса из одного из моих проектов?
public abstract class SingletonCache<K, V> {
private final ConcurrentMap<K, V> cache = new ConcurrentHashMap<K, V>();
public V get(K key) {
V value = cache.get(key);
if (value == null) {
cache.putIfAbsent(key, newInstance(key));
value = cache.get(key);
}
return value;
}
protected abstract V newInstance(K key);
}
Чтобы использовать его, вы расширяете его и реализуете метод newInstance
, который создает новое значение в случае пропуска кэша. Затем вызовите метод get
с ключом, чтобы получить экземпляр, соответствующий этому ключу. Здесь - пример того, как он используется.
Этот класс гарантирует, что для каждого ключа возвращается только один экземпляр, но метод newInstance
может вызываться несколько раз, и в этом случае используется первый вычисленный экземпляр, а остальные отбрасываются. Также обратите внимание, что этот кэш не удаляет старые экземпляры, но хранит все значения неопределенно (в моем случае использования существует ограниченное количество экземпляров, которые должны быть кэшированы). Чтение из ConcurrentHashMap не использует блокировку, поэтому оно должно удовлетворить ваши требования к эффективности.