Sincronización en un caché de HashMap

Tengo una aplicación web donde la gente pide recursos. Estos recursos se almacenan en caché utilizando un mapa hash sincronizado para mayor eficiencia. El problema aquí es cuando llegan dos solicitudes diferentes para el mismo recurso no almacenado en caché al mismo tiempo: la operación que recupera los recursos ocupa mucha memoria, por lo que quiero evitar llamarlo más de una vez para el mismo recurso.

¿Puede alguien decirme si hay algún problema potencial con el siguiente fragmento? Gracias por adelantado

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);
      }
    }
  }

  ...

}

Respuestas a la pregunta(4)

Su respuesta a la pregunta