comment pensez-vous, devons-nous utiliser le bloc synchronisé pour une meilleure optimisation de l'accès à l'instance de l'annonce? L'instance de Ad.class peut être extraite de différents threads. Synchronized aide à obtenir une instance en une fois avec une opération get de ConcurrentHashMap. ConcurrentHashMap stocke toutes les valeurs comme volatiles. Je l'utilise sur java 1.7 pour android, computeIfAbsent est disponible en java 1.8.ConcurrentHashMap comme cache singletone avec
Ce sera génial d'obtenir une réponse détaillée, pourquoi pas ou pourquoi oui. Merci!
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() {
}
}
MISE À JOUR: Merci à tous de l'aide. J'ai remplacé ConcurrentHashMap par HashMap.
Si vous lisez les javadocs, cette classe a été conçu pour éviter le blocage. Le bloc synchronisé n'a pas de sens. Vous pouvez aussi utiliser une table de hachage – efekctive
Oui, si vous utilisez ensemble 'synchronized' et' ConcurrentHashMap', vous n'utilisez pas 'ConcurrentHashMap' correctement, ou vous devriez utiliser une collection non-threadsafe à la place. –