Est le code suivant configuré pour synchroniser correctement les appels sur synchronizedMap
?
public class MyClass {
private static Map<String, List<String>> synchronizedMap = Collections.synchronizedMap(new HashMap<String, List<String>>());
public void doWork(String key) {
List<String> values = null;
while ((values = synchronizedMap.remove(key)) != null) {
//do something with values
}
}
public static void addToMap(String key, String value) {
synchronized (synchronizedMap) {
if (synchronizedMap.containsKey(key)) {
synchronizedMap.get(key).add(value);
}
else {
List<String> valuesList = new ArrayList<String>();
valuesList.add(value);
synchronizedMap.put(key, valuesList);
}
}
}
}
De ma compréhension, j'ai besoin de la synchronisation de bloc en addToMap()
pour éviter un autre thread à partir de l'appelant remove()
ou containsKey()
avant que je reçois à travers l'appel à put()
mais je n'ai pas besoin d'un bloc synchronisé en doWork()
parce qu'un autre thread ne peut entrer dans le bloc synchronisé en addToMap()
avant remove()
retourne parce que j'ai créé la Carte à l'origine avec l' Collections.synchronizedMap()
. Est-ce exact? Est-il une meilleure façon de le faire?