Синхронизация в кэше HashMap

У меня есть веб-приложение, в котором люди запрашивают ресурсы. Эти ресурсы кэшируются с использованием синхронизированной хеш-карты для повышения эффективности. Проблема здесь в том, что два разных запроса поступают для одного и того же некэшированного ресурса одновременно: операция извлечения ресурсов занимает много памяти, поэтому я не хочу вызывать ее более одного раза для одного и того же ресурса.

Кто-нибудь, пожалуйста, скажите мне, есть ли потенциальная проблема со следующим фрагментом? Заранее спасибо.

private Map<String, Resource> resources = Collections.synchronizedMap(new HashMap<String, Resource>());

public void request(String name) {

  Resource resource = resources.get(name);

  if (resource == null) {
    synchronized(this) {
      if (resources.get(name) == null) {
        resource = veryCostlyOperation(name); // This should only be invoked once per resource...
        resources.put(resource);
      } else {
        resource = resources.get(name);
      }
    }
  }

  ...

}
7
задан Erick Robertson 30 March 2011 в 15:13
поделиться