我有一個Web應用程序,人們要求資源。這些資源使用同步哈希映射來提高效率。這裏的問題是當兩個不同的請求同時出現在相同的未緩存資源中時:檢索資源的操作佔用大量內存,所以我想避免爲同一資源多次調用它。在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);
}
}
}
...
}
感謝您使用FutureTask,我已經在內部看過這個類,但從來不知道它有這個特性。 – Boris 2011-03-30 16:06:59
與此相關的問題是您可以同時在多個資源上調用veryCostlyOperation。 OP提到他不想在同一個資源上稱兩次,但這可能是曲線擬合的評論。如果在您的代碼中同時請求十二個不同的資源,那麼十二個「veryCostlyOperation」調用將全部並行。如果他們的確內存密集,你可能會用完內存。 – 2011-03-30 16:14:12