您如何看待我們是否需要使用同步塊進行更好的優化訪問Ad實例? Ad.class的實例可以從不同的線程中獲取。同步有助於通過ConcurrentHashMap中的一個獲取操作一次獲取實例。 ConcurrentHashMap將所有值存儲爲volatile。我在java 1.7上使用它爲android,computeIfAbsent在java 1.8中可用。ConcurrentHashMap作爲單點緩存與同步
這將是很好的得到詳細的答案,爲什麼不或爲什麼是。 謝謝!
public final class Ad {
private final static Map<String, Ad> ads = new ConcurrentHashMap<>();
public static Ad get(@NonNull String appId) {
if (appId == null) appId = "";
boolean containsAd = ads.containsKey(appId);
Ad localInstance = containsAd ? ads.get(appId) : null;
if (localInstance == null) {
synchronized (Ad.class) {
containsAd = ads.containsKey(appId);
localInstance = containsAd ? ads.get(appId) : null;
if (localInstance == null) {
localInstance = new Ad();
localInstance.setAdId(appId);
ads.put(appId, localInstance);
}
}
}
return localInstance;
}
private Ad() {
}
}
UPDATE:感謝所有的幫助。我將ConcurrentHashMap替換爲HashMap。
如果你讀的Javadoc,這個類的目的是防止鎖定。同步塊沒有意義。您可以使用散列表 – efekctive
是的,如果您發現自己同時使用'synchronized'和'ConcurrentHashMap',那麼您要麼沒有正確使用'ConcurrentHashMap',要麼應該使用非線程安全集合。 –