Le code suivant est-il configuré pour synchroniser correctement les appels 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);
}
}
}
}
D'après ce que je comprends, j'ai besoin du bloc synchronisé addToMap()
pour empêcher un autre thread d'appeler remove()
ou containsKey()
avant de passer l'appel, put()
mais je n'ai pas besoin d'un bloc synchronisé doWork()
car un autre thread ne peut pas entrer dans le bloc synchronisé addToMap()
avant les remove()
retours car j'ai créé la carte à l'origine avec Collections.synchronizedMap()
. Est-ce exact? Y a-t-il une meilleure manière de faire cela?